sqliteopenhelper 類別存取 sqlite 建國科技大學 資管系 饒瑞佶 2013/5 v1

Post on 19-Dec-2015

253 Views

Category:

Documents

5 Downloads

Preview:

Click to see full reader

TRANSCRIPT

SQLiteOpenHelper 類別存取SQLite

建國科技大學 資管系饒瑞佶

2013/5 V1

資料庫• 儲存資料的結構• 分成檔案式與 server 式• 透過 SQL 指令 ( 新 / 刪 / 修 / 查 ) 溝通,需會動態 SQL 指

令欄位 1 欄位 2 欄位 3

資料 資料 資料

學號 姓名 性別9863001 小叮噹 男9863002 大雄 男

一筆資料

管理者要處理

程式要處理

建立資料庫• 資料庫 資料表 欄位• 欄位會有名稱、資料型態、設定等等

資料庫

資料表

欄位

欄位

欄位

資料表

欄位

欄位

欄位…

如果是 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

InternetIntranet

Web Service

SQLite

Android

單機資料庫

遠端資料庫

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,mStrings)); }

改呼叫 getdataByListView

result

加入 onListItemClick 偵測點按事件

加入點按動作

@Overrideprotected 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

result

加入項目勾選設定

資料異動

再改寫顯示方式• 新加入 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) 值• 將刪除功能放入選單

刪除指令

新增• 加入 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(); }});

top related