1.24k likes | 1.46k Vues
Android 智慧型手機程式設計 程式設計與應用班. Android 資料庫處理. 建國科技大學 資管系 饒瑞佶 2012/4 V1 2012/8 V2. Android 資料庫- SQLite. 資料庫 SQLite 檔案式資料庫 適合嵌入式系統,不需要額外安裝系統 OPEN SOURCE 資料庫 SQL 指令與一般 DBMS 大同小異,但有些微差異. SQLite. Android. 結構 1. 資料. class DatabaseHelper extends SQLiteOpenHelper. 結構 2. SQL 指令. 資料.
E N D
Android智慧型手機程式設計 程式設計與應用班 Android資料庫處理 建國科技大學 資管系 饒瑞佶 2012/4 V1 2012/8 V2
Android資料庫-SQLite • 資料庫 • SQLite • 檔案式資料庫 • 適合嵌入式系統,不需要額外安裝系統 • OPEN SOURCE資料庫 • SQL指令與一般DBMS大同小異,但有些微差異
SQLite Android 結構1 資料 class DatabaseHelper extends SQLiteOpenHelper 結構2 SQL指令 資料 adb shell + sqlite3+SQL指令
SQLite管理 adb shell + sqlite3 提醒…這也只是其中一種方法
SQLite操作-adb shell • 沒有AVD或是手機 沒有連線的device
SQLite操作-adb shell • 先用android list avd 看可以用的AVD 可用的AVD
SQLite操作-adb shell • 再使用emulator –avd <AVD名稱>啟動一個AVD • 例如:emulator –avd my_avd –sdcard img檔位置 啟動中的my_avd 記得要有sdcard
SQLite操作-adb shell • my_avd模擬器
SQLite操作-adb shell • 再次執行adb shell,就可以看到#提示符號 #提示符號
SQLite操作-adb shell • 建議進入sdcard或mnt\sdcard內建立目錄存放資料庫 進入sdcard 在sdcard內建立mydb目錄 進入mydb目錄
SQLite操作-adb shell • 請在#提示符號後輸入sqlite3 <資料庫名稱> • 例如sqlite3 db1 • 如果資料庫不存在會自動建立,可以看到sqlite>提示符號 sqlite>提示符號
SQLite操作-adb shell • 離開是.quit (注意有一個.) • 現在可以開始操作db1資料庫 • 使用SQL指令進行操作,包括: • 建立欄位與資料表(結構部分) • 建立資料(資料部分) • 維護資料(資料部分)
SQLite結構相關SQL指令 不分大小寫
SQL指令-結構操作 • create table:建立資料表 • 藍色是要填資料的部分,其它是固定語法 • 所有SQL指令都要以;結束 • create table member( • id char(20) not null, • name char(20) not null, • pwd char(20) not null, • age int, • PRIMARY KEY(id) • ); • create table資料表名稱 ( • 欄位1 資料型態, • 欄位2 資料型態, • …. • );
SQL指令-結構操作 • .tables:可以查看目前資料庫內存在的資料表 • .help:可以看sqlite3所有指令 沒有任何資料表
SQL指令-結構操作 • create table:建立資料表 member資料表已經被建立
SQL指令-結構操作 • .schema:查看資料表結構 member資料表結構
SQL指令-結構操作 • alter table:更改資料表結構 增加欄位 • alter table資料表名稱 add 欄位1 資料型態; 更改資料表名稱 • alter table資料表名稱 rename to 新資料表名稱; • drop table:刪除資料表 • drop table資料表名稱;
SQL指令-資料操作 • insert:新增資料 所有資料都要加上單引號 • insert into 資料表名稱 (欄位1,欄位2…) values (‘資料1’,’資料2’…); Insert into member (id,name,pwd,age) values ('A123','小叮噹','1111',20); 已在member資料表中新增一筆資料
SQL指令-資料操作 • Select:篩選資料 • select 欄位s from資料表名稱 where條件; Select * from member; 加入where條件
SQL指令-資料操作 • update:更新資料 • update 資料表名稱 set 欄位=‘新值’… where條件; update member set name=‘大寶' where id='A123'; 姓名改成大寶
SQL指令-資料操作 • delete:刪除資料 • Delete from 資料表名稱 where條件; delete from member where id='A123'; 先新增一筆資料 刪除剛新增的資料
SQL指令-結構操作 • SQLite沒有刪除欄位的指令,例如 ALTER TABLE DROP COLUMN • 那怎麼辦?
SQL指令-結構操作 新增一個備份資料庫member_backup 將資料從member搬到member_backup 刪除member 再新增一個member,此時不要含要刪掉的欄位 再把資料從member_backup搬到member 刪除member_backup 完成
更多SQLite SQL指令 • http://www.newobjects.com/pages/ndl/SQLite3/sql.htm#ALTER TABLE
SQLite+Android By SQLiteOpenHelper
SQLite+Android • 建立新專案-HelloDB
Android+SQLite使用方式 • 引用class SQLiteOpenHelper • 建立SQLiteOpenHelper 物件 • 透過SQLiteOpenHelper 物件建立database物件 • 透過database物件存取資料 記得要開android.permission.WRITE_EXTERNAL_STORAGE
SQLiteOpenHelper運作架構 與APK建立在一起 class DatabaseHelper extends SQLiteOpenHelper { public DatabaseHelper(Context context) { super(context, “db2.db", null, 1); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(DATABASE_CREATE_TABLE); //新增資料表 } @Override public void onUpgrade(SQLiteDatabase db, int oldV, int newV) { } } 只有在資料庫不存在時才執行 只有在DatabaseHelper此建構子有執行時才執行 資料庫版本有更新時才執行
SQLite+Android • 首先,在主程式中加入SQLiteOpenHelper結構 必要的class 建立db2.db資料庫 資料庫第一次建立時會執行onCreate 資料庫異動版本時會執行onUpgrade
SQLite+Android • SQLiteOpenHelper結構 // SQLite資料庫使用必要class ------------------------ String DATABASE_TABLE = "member"; String DATABASE_CREATE_TABLE = "create table " + DATABASE_TABLE + "(_id char(20), name, pwd, age, primary key(_id));"; class DatabaseHelper extends SQLiteOpenHelper { public DatabaseHelper(Context context) { super(context, "/sdcard/db2.db", null, 1); } @Override public void onCreate(SQLiteDatabase db) { } @Override public void onUpgrade(SQLiteDatabase db, int oldV, int newV) { } } 如果要建立到sdcard
SQLite+Android • 從class HelloDB呼叫DatabaseHelper建立資料庫 建立DatabaseHelper物件 呼叫建立db2.db資料庫
code DatabaseHelper dbHelper; SQLiteDatabase db; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.my_db); dbHelper=new DatabaseHelper(this); db=dbHelper.getWritableDatabase(); }
SQLite+Android • 資料庫被建立在data/data/com.android.hellodb
SQLite+Android • 資料庫被建立在data/data/com.android.hellodb
SQLite+Android • 有資料庫後,下一步要建立資料 新增資料 定義資料表結構 建立資料表
建立資料 String cmd="insert into " + DATABASE_TABLE + " (_id,name,pwd,age) values ('c123','小黑','ccc',12)"; db.execSQL(cmd);
SQLite+Android • 為何會錯誤? 跟執行流程或 資料庫設定有關!
SQLite+Android • 幾點注意! 1.下面這段只有在資料庫第一次被建立時才會進行,所以如果資料庫已經存在,那就不會建立資料表,當然也就不能寫入資料 上張投影片的錯誤就是因為我們已經先建立db2.db,因此再次執行程式時,並不會建立資料表,導致下面程式出錯
SQLite+Android • 正常執行結果 資料庫 資料表 資料 中文資料有亂碼
到此為止,同樣的程式再執行一次會出現錯誤,WHY?到此為止,同樣的程式再執行一次會出現錯誤,WHY?
SQLite+Android • 最後,可以進行資料查詢 再新增一筆資料(小黑) SQL查詢指令 資料移動到第一筆 顯示資料
String cmd_select="select * from " + DATABASE_TABLE; Cursor c=db.rawQuery(cmd_select, null); 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(HelloDB.this) .setTitle("data") .setMessage(data) .setPositiveButton("確認",new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }) .show();
SQLite+Android • 實際顯示沒有亂碼
小練習 • 使用上述課程member資料表 • 設計一個登入畫面,可以讓使用者輸入帳號與密碼 • 輸入完成後按下「確認」按鈕後,連回資料庫內的member 資料表進行確認(id與pwd欄位) • 輸入正確者跳至下一個頁面(自訂),錯誤者請跳出訊息提示框
透過ListView顯示資料整個版面都用ListActivity 改成ListActivity 刪除
透過ListView顯示資料 ArrayAdapter 陣列資料
透過ListView顯示資料 setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,mStrings)); getListView().setTextFilterEnabled(true); 陣列資料 private static final String[] mStrings = new String[] { "大餅包小餅", "蚵仔煎", "東山鴨頭", "臭豆腐", "潤餅", "豆花", "青蛙下蛋","豬血糕", "大腸包小腸", "鹹水雞", "烤香腸","車輪餅","珍珠奶茶","鹹酥雞","大熱狗", "炸雞排","山豬肉","花生冰","剉冰","水果冰", "包心粉圓","排骨酥","沙茶魷魚","章魚燒","度小月", "aaa","abc","bbb","bcd","123" };