620 likes | 834 Views
SQLiteOpenHelper 類別存取 SQLite. 建國科技大學 資管系 饒瑞佶 2013/5 V1. 資料庫. 儲存資料的結構 分成檔案式與 server 式 透過 SQL 指令 ( 新 / 刪 / 修 / 查 ) 溝通,需會動態 SQL 指令. 一筆資料. 管理者要處理. 程式要處理. 建立資料庫. 資料庫 資料表 欄位 欄位會有名稱、資料型態、設定等等. 資料庫. 資料表. 資料表. 欄位. 欄位. 欄位. 欄位. …. 欄位. 欄位. 如果是 SQLite.
E N D
SQLiteOpenHelper類別存取SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1
資料庫 • 儲存資料的結構 • 分成檔案式與server式 • 透過SQL指令(新/刪/修/查)溝通,需會動態SQL指令 一筆資料 管理者要處理 程式要處理
建立資料庫 • 資料庫 資料表 欄位 • 欄位會有名稱、資料型態、設定等等 資料庫 資料表 資料表 欄位 欄位 欄位 欄位 … 欄位 欄位
如果是SQLite • 透過管理介面建立(這裡我們用firefox的外掛SQLite Manager) • 透過adb內的sqlite3指令進行 • 透過程式建立
SQLite Manager • FireFox外掛 • https://addons.mozilla.org/en-US/firefox/addon/sqlite-manager/ • 直接點選安裝
SQLite Manager 直接建立/開啟SQLite database 有UI介面比較好操作
SQLite Manager • 實體手機可以開啟USB連結模式,透過外接碟模式被開啟 • AVD內的資料庫可以透過adb pull拉出,設定後再用adb push存回,或使用ddms來完成
Android連結資料庫 MySQL SQL Server Web Service 遠端資料庫 Internet Intranet Android SQLite 單機資料庫
Android vs. SQLite • 透過SQLiteOpenHelper類別來操作 • 建立資料庫 (建構子) • 建立資料表 (onCreate方法) • 更新資料庫 (onUpgrade方法) • 從SQLiteOpenHelper類別建立物件,同時配合SQL指令來操作資料庫
Android vs. SQLite運作流程 執行建構子 是否有資料庫? 無 建立資料庫 有 進入onCreate 建立資料表 檢查版本 開啟或更新資料庫 使用資料庫
Extends SQLiteOpenHelper • 產生新class-MySQLite
透過建構子建立/取得資料庫透過onCreate建立資料表透過建構子建立/取得資料庫透過onCreate建立資料表 這裡有修正
publicclass MySQLite extends SQLiteOpenHelper { SQLiteDatabase db; // 資料庫物件 public MySQLite(Context context) { super(context, "/sdcard/db2.db", null, 1); db=this.getWritableDatabase(); //將db對應到 /sdcard/db2.db } @Override publicvoid 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 publicvoid onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { // TODO自動產生的方法 Stub } }
提示 • 未來就透過class MySQLite 來操作資料庫 • 資料部分則是透過class MySQLite內的db物件 • 當然操作資料需要透過SQL指令
publicclass Main extends Activity { MySQLite dbHelper; //透過MySQLite宣告物件dbHelper @Override protectedvoid 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); } }
查詢資料 • 建立查詢方法getdata
privatevoidgetdata(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() { publicvoid onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }) .show(); }
使用ListActivity 改成ListActivity 刪除
privatevoidgetdataByListView(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,mStrings)); }
加入點按動作 @Override protectedvoid 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(); }
透過ListView顯示資料 • 假設是在Activity中除了ListView之外,還要放入其他的View時,這時候就需要在Activity中加入一個ListView物件,利用這個ListView的setAdapter來連接Adapter
privatevoidgetdataByListView(String sql){ Cursor c=dbHelper.db.rawQuery(sql, null); //透過Cursor取得資料 c.moveToNext(); // 將指標移動到第一筆資料 String[] mStrings = new String[c.getCount()]; for(inti=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,mStrings)); lv.setAdapter(newArrayAdapter<String>(this,android.R.layout.simple_list_item_1,mStrings)); lv.setOnItemClickListener(newOnItemClickListener(){ @Override publicvoidonItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { String keyword=lv.getItemAtPosition(arg2).toString(); Toast.makeText(Main.this, "選擇了:"+ keyword, Toast.LENGTH_SHORT).show(); } }); }
加入項目勾選設定 lv.setChoiceMode( ListView.CHOICE_MODE_SINGLE );
再改寫顯示方式 • 新加入getdataBySimpleAdapter方法 記得改呼叫 getdataBySimpleAdapter(cmd_select);
privatevoid 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"}, //欄位 newint[] { android.R.id.text1 }); //顯示文字 lv.setChoiceMode( ListView.CHOICE_MODE_SINGLE ); //設定可勾選 lv.setAdapter(adapter); lv.setOnItemClickListener(new OnItemClickListener(){ //觸發選按事件 @Override publicvoid 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)值 • 將刪除功能放入選單