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

62
SQLiteOpenHelper 類類類類 SQLite 類類類類類類 類類類 類類類 2013/5 V1

Upload: maud-richard

Post on 19-Dec-2015

253 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

SQLiteOpenHelper 類別存取SQLite

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

2013/5 V1

Page 2: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

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

令欄位 1 欄位 2 欄位 3

資料 資料 資料

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

一筆資料

管理者要處理

程式要處理

Page 3: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

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

資料庫

資料表

欄位

欄位

欄位

資料表

欄位

欄位

欄位…

Page 4: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

如果是 SQLite

• 透過管理介面建立 ( 這裡我們用 firefox的外掛 SQLite Manager)

• 透過 adb 內的 sqlite3 指令進行• 透過程式建立

Page 5: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

SQLite Manager• FireFox外掛

– https://addons.mozilla.org/en-US/firefox/addon/sqlite-manager/

• 直接點選安裝

Page 6: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

SQLite Manager直接建立 /開啟 SQLite database

有 UI介面比較好操作

Page 7: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

SQLite Manager

• 實體手機可以開啟 USB連結模式,透過外接碟模式被開啟• AVD內的資料庫可以透過 adb pull拉出,設定後再用 adb push存回,或使用 ddms來完成

Page 8: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

Android 連結資料庫MySQL

SQL Server

InternetIntranet

Web Service

SQLite

Android

單機資料庫

遠端資料庫

Page 9: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

Android vs. SQLite• 透過 SQLiteOpenHelper 類別來操作– 建立資料庫 ( 建構子 )– 建立資料表 (onCreate 方法 )– 更新資料庫 (onUpgrade 方法 )

• 從 SQLiteOpenHelper 類別建立物件,同時配合 SQL 指令來操作資料庫

Page 10: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

Android vs. SQLite運作流程

是否有資料庫?

執行建構子

開啟或更新資料庫

建立資料庫

進入 onCreate建立資料表

使用資料庫

有檢查版本

Page 11: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

實作 SQLiteOpenHelper 類別

Page 12: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

Extends SQLiteOpenHelper• 產生新 class - MySQLite

Page 13: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

繼承 SQLIiteOpenHelper

Page 14: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

尚需要加入建構子

Page 15: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1
Page 16: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

建構子

Page 17: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

建立資料庫與資料表

Page 18: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

透過建構子建立 / 取得資料庫透過 onCreate 建立資料表

這裡有修正

Page 19: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

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

}}

Page 20: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

提示• 未來就透過 class MySQLite 來操作資

料庫• 資料部分則是透過 class MySQLite 內的db 物件

• 當然操作資料需要透過 SQL 指令

Page 21: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

使用資料庫

Page 22: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

透過 class MySQLite 建立資料

Page 23: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

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

Page 24: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

使用 sqlite3 確認

Page 25: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

查詢資料• 建立查詢方法 getdata

Page 26: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

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(); }

Page 27: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

呼叫 getdata

Page 28: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

透過 ListView顯示資料庫資料

Page 29: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

使用 ListActivity改成 ListActivity

刪除

Page 30: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

建立查詢方法 getdataByListView

Page 31: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

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

Page 32: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

改呼叫 getdataByListView

Page 33: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

result

Page 34: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

加入 onListItemClick 偵測點按事件

Page 35: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

加入點按動作

@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();}

Page 36: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

result

Page 37: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

透過 ListView顯示資料

• 假設是在 Activity中除了 ListView之外,還要放入其他的 View時,這時候就需要在 Activity中加入一個 ListView物件,利用這個ListView 的 setAdapter來連接Adapter

Page 38: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

版面中加入 ListView

Page 39: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

恢復成 Activity

Page 40: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

修改 getdataByListView

Page 41: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

result

Page 42: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

加入 setOnItemClickListener

Page 43: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1
Page 44: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

result

Page 45: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

加入項目勾選設定

Page 46: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

資料異動

Page 47: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

再改寫顯示方式• 新加入 getdataBySimpleAdapter 方法

記得改呼叫 getdataBySimpleAdapter(cmd_select);

Page 48: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

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(); } });}

Page 49: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

刪除• 取得要刪除的主鍵 (_id) 值• 將刪除功能放入選單

Page 50: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

刪除指令

Page 51: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1
Page 52: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

新增• 加入 xml版面

Page 53: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

新增• 加入 Add.java

Page 54: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

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(); } }); }}

Page 55: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

加入從 Main 跳至 Add

Intent it=new Intent(); // 跳至新增主畫面it.setClass(Main.this, Add.class);startActivity(it);

Page 56: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

result

Page 57: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

修改• 加入修改畫面

Page 58: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

Main 加入修改跳頁與傳值

Intent intent = new Intent(Main.this, Update.class);intent.putExtra("EMPLOYEE_ID",mID);startActivity(intent);

Page 59: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

修改程式• 先顯示出資料

Page 60: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

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; }

Page 61: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

修改程式• 加入修改指令

Page 62: SQLiteOpenHelper 類別存取 SQLite 建國科技大學 資管系 饒瑞佶 2013/5 V1

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(); }});