SQLiteOpenHelper 類別存取 SQLite 建國科技大學資管系 饒瑞佶 2013/5 V1
Android 連結資料庫 MySQL SQL Server Web Service 遠端資料庫 Internet Intranet Android SQLite 單機資料庫
Android vs. SQLite 透過 SQLiteOpenHelper 類別來操作 建立資料庫 ( 建構子 ) 建立資料表 (oncreate 方法 ) 更新資料庫 (onupgrade 方法 ) 從 SQLiteOpenHelper 類別建立物件, 同時配合 SQL 指令來操作資料庫
Android vs. SQLite 運作流程 建構子 是否有資料庫? 有 檢查版本 無 建立資料庫 進入 oncreate 建立資料表 開啟資料庫 使用資料庫
實作 SQLiteOpenHelper 類別
Extends SQLiteOpenHelper 產生新 class-mysqlite
繼承 SQLIiteOpenHelper
尚需要加入建構子
建構子
建立資料庫與資料表
透過建構子建立 / 取得資料庫 透過 oncreate 建立資料表 這裡有修正
public class MySQLite extends SQLiteOpenHelper { SQLiteDatabase db; // 資料庫物件 public MySQLite(Context context) { super(context, "/sdcard/db2.db", null, 1); db=this.getwritabledatabase(); // 將 db 對應到 /sdcard/db2.db } @Override public void oncreate(sqlitedatabase db) { // 建立資料表 String DATABASE_TABLE = "member"; String DATABASE_CREATE_TABLE = "create table " + DATABASE_TABLE + "(_id char(20), name char(10), pwd char(10), age integer, primary key(_id));"; db.execsql(database_create_table); } @Override public void onupgrade(sqlitedatabase arg0, int arg1, int arg2) { // TODO 自動產生的方法 Stub } }
提示 未來就透過 class MySQLite 來操作資料庫 資料部分則是透過 class MySQLite 內的 db 物件 當然操作資料需要透過 SQL 指令
使用資料庫
透過 class MySQLite 建立資料
public class Main extends Activity { MySQLite dbhelper; // 透過 MySQLite 宣告物件 dbhelper @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); dbhelper = new MySQLite(this); // 建立 dbhelper 物件 String cmd="insert into member (_id,name,pwd,age) values ('A123',' 小白 ','ccc',12)"; dbhelper.db.execsql(cmd); } }
使用 sqlite3 確認
查詢資料 建立查詢方法 getdata
private void getdata(string sql){ Cursor c=dbhelper.db.rawquery(sql, null); // 透過 Cursor 取得資料 c.movetonext(); // 將指標移動到第一筆資料 String data=""; for(int i=1;i<=c.getcount();i++){ // 取回資料 for(int j=1;j<=c.getcolumncount();j++){ data +=c.getstring(j-1); } data +="\n"; c.movetonext(); } new AlertDialog.Builder(Main.this) // 顯示資料.setTitle("data").setMessage(data).setPositiveButton(" 確認 ",new DialogInterface.OnClickListener() { public void onclick(dialoginterface dialog, int which) { // TODO Auto-generated method stub } }).show(); }
呼叫 getdata
透過 ListView 顯示資料庫資料
使用 ListActivity 改成 ListActivity 刪除
建立查詢方法 getdatabylistview
private void getdatabylistview(string sql){ Cursor c=dbhelper.db.rawquery(sql, null); // 透過 Cursor 取得資料 c.movetonext(); // 將指標移動到第一筆資料 String[] mstrings = new String[c.getCount()]; for(int i=1;i<=c.getcount();i++){ // 取回資料 mstrings[i-1]=new String(c.getString(1)); c.movetonext(); } // 顯示資料 setlistadapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,mStri ngs)); }
改呼叫 getdatabylistview
result
加入 onlistitemclick 偵測點按事件
加入點按動作 @Override protected void onlistitemclick(listview l, View v, int position, long id) { // TODO 自動產生的方法 Stub super.onlistitemclick(l, v, position, id); Object o=this.getlistadapter().getitem(position); String keyword=o.tostring(); Toast.makeText(Main.this, " 選擇了 :" + keyword, Toast.LENGTH_SHORT).show(); }
result
透過 ListView 顯示資料 假設是在 Activity 中除了 ListView 之外, 還要放入其他的 View 時, 這時候就需要在 Activity 中加入一個 ListView 物件, 利用這個 ListView 的 setadapter 來連接 Adapter
版面中加入 ListView
恢復成 Activity
修改 getdatabylistview
result
加入 setonitemclicklistener
private void getdatabylistview(string sql){ Cursor c=dbhelper.db.rawquery(sql, null); // 透過 Cursor 取得資料 c.movetonext(); // 將指標移動到第一筆資料 String[] mstrings = new String[c.getCount()]; for(int i=1;i<=c.getcount();i++){ // 取回資料 mstrings[i-1]=new String(c.getString(1)); c.movetonext(); } // 顯示資料 //setlistadapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,mString s)); lv.setadapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,mString s)); lv.setonitemclicklistener(new OnItemClickListener(){ @Override public void onitemclick(adapterview<?> arg0, View arg1, int arg2, long arg3) { String keyword=lv.getitematposition(arg2).tostring(); Toast.makeText(Main.this, " 選擇了 :" + keyword, Toast.LENGTH_SHORT).show(); } }); }
result
加入項目勾選設定 lv.setchoicemode( ListView.CHOICE_MODE_SINGLE );
資料異動
再改寫顯示方式 新加入 getdatabysimpleadapter 方法 記得改呼叫 getdatabysimpleadapter(cmd_select);
private void getdatabysimpleadapter(string sql){ Cursor c=dbhelper.db.rawquery(sql, null); // 透過 Cursor 取得資料 SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.r.layout.simple_list_item_checked, // 版面 c, // 查詢資料 new String[] {"name","_id"}, // 欄位 new int[] { android.r.id.text1 }); // 顯示文字 lv.setchoicemode( ListView.CHOICE_MODE_SINGLE ); // 設定可勾選 lv.setadapter(adapter); lv.setonitemclicklistener(new OnItemClickListener(){ // 觸發選按事件 @Override public void onitemclick(adapterview<?> arg0, View arg1, int arg2,long arg3) { Cursor cursor = (Cursor)lv.getAdapter().getItem(arg2); //arg2 是位置 String keyword =cursor.getstring(cursor.getcolumnindex("_id")); Toast.makeText(Main.this, " 您選擇了 : " + keyword, Toast.LENGTH_LONG).show(); } }); }
刪除 取得要刪除的主鍵 (_id) 值 將刪除功能放入選單
刪除指令
dbhelper.db.delete("member", "_id='" + mid + "'", null); Toast.makeText(Main.this, " 資料刪除完成 ", Toast.LENGTH_LONG).show(); getdatabysimpleadapter("select * from member"); // 重新整理
加入 xml 版面 新增
加入 Add.java 新增
public class Add extends Activity { MySQLite dbhelper; // 透過 MySQLite 宣告物件 dbhelper EditText ed1; // 帳號 EditText ed2; // 姓名 EditText ed3; // 密碼 EditText ed4; // 年齡 Button bt1; // 新增按紐 @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.add); dbhelper = new MySQLite(this); // 建立 dbhelper 物件 ed1=(edittext)findviewbyid(r.id.edittext1); ed2=(edittext)findviewbyid(r.id.edittext2); ed3=(edittext)findviewbyid(r.id.edittext3); ed4=(edittext)findviewbyid(r.id.edittext4); bt1=(button)findviewbyid(r.id.button1); bt1.setonclicklistener(new View.OnClickListener() { @Override public void onclick(view v) { // 新增程式 String cmd="insert into member (_id,name,pwd,age) values ('" + ed1.gettext() + "','" + ed2.gettext() + "','" + ed3.gettext() + "'," + ed4.gettext() + ")"; dbhelper.db.execsql(cmd); Toast.makeText(Add.this, " 資料新增完成 ", Toast.LENGTH_LONG).show(); Intent it=new Intent(); // 跳回主畫面 it.setclass(add.this, Main.class); startactivity(it); Add.this.finish(); } }); } }
加入從 Main 跳至 Add Intent it=new Intent(); // 跳至新增主畫面 it.setclass(main.this, Add.class); startactivity(it);
result
加入修改畫面 修改
Main 加入修改跳頁與傳值 Intent intent = new Intent(Main.this, Update.class); intent.putextra("employee_id",mid); startactivity(intent);
先顯示出資料 修改程式
public class Update extends Activity { MySQLite dbhelper; // 透過 MySQLite 宣告物件 dbhelper EditText ed1; // 帳號 EditText ed2; // 姓名 EditText ed3; // 密碼 Button bt1; // 新增按紐 String mid; // 要修改的資料編號 @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.update); dbhelper = new MySQLite(this); // 建立 dbhelper 物件 ed1=(edittext)findviewbyid(r.id.edittext1); ed2=(edittext)findviewbyid(r.id.edittext2); ed3=(edittext)findviewbyid(r.id.edittext3); bt1=(button)findviewbyid(r.id.button1); mid = this.getintent().getextras().getstring("employee_id"); // 要修改的資料編號 // 將資料顯示出來 String cmd_select="select * from member where _id='" + mid + "';"; Cursor c = dbhelper.db.rawquery(cmd_select, null); // 執行 SQL 指令, 進行資料查詢 if(c.movetonext()){ // 有資料才顯示 ed1.settext(c.getstring(c.getcolumnindex("name"))); // 姓名 ed2.settext(c.getstring(c.getcolumnindex("pwd"))); // 密碼 ed3.settext(c.getstring(c.getcolumnindex("age"))); // 年齡 }else{ Toast.makeText(Update.this, " 找不到任何資料 ", Toast.LENGTH_LONG).show(); return; }
加入修改指令 修改程式
bt1.setonclicklistener(new View.OnClickListener() { @Override public void onclick(view v) { // 新增程式 String cmd="update member set name='" + ed1.gettext() + "',pwd='" + ed2.gettext() + "',age=" + ed3.gettext() + " where _id='" + mid + "'"; dbhelper.db.execsql(cmd); Toast.makeText(Update.this, " 資料修改完成 ", Toast.LENGTH_LONG).show(); Intent it=new Intent(); // 跳回主畫面 it.setclass(update.this, Main.class); startactivity(it); Update.this.finish(); } });