這篇介紹Andorid裡面內建好的套裝SQLite API
會配合sqlteman的工具來對照內容
1. 首先可以到官網爬爬database的文件
http://developer.android.com/reference/android/database/package-summary.html
然有有提到所有的database都會存在裝置的/data/data/<package_name>/databases
2. 首先建立一個專案, 以testsqlite為例, 然後用DDMS進到/data/data/com.example.testsqlite
可以發現, 沒有databases的資料夾, 這是正常的, 因為還沒有開始使用
3. 創建一個SQLite的DataBase, 必須要宣告一個class來繼承SQLiteOpenHelper,
這邊以創建SQLiteDB然後繼承SQLiteOpenHelper,
然後在新增內建的建構子constructor
4. 然後在Add unimplemented methods
5. 接著宣告table的名稱字串, 當然依照code的使用, 會有更好的宣告位置
6. 接著在onCreate的方法內, 宣告一個字串, 裡面是SQLite的語法
這邊以
final String create = "CREATE TABLE IF NOT EXISTS "
+ tableName + " ("
+ "name" + " TEXT NOT NULL, "
+ "id" + " INTEGER PRIMARY KEY,"
+ "age" + " INTEGER"
+ ")";
為例,
然後用db.execSQL(create); 執行
7. 接著在onUpgrade的方法中, 選擇要處理的動作
這邊基本上也可以不寫, 通常會使用砍掉並重新建造的方式
以下為例
final String drop = "DROP TABLE " + tableName;
db.execSQL(drop);
onCreate(db);
8. 然後回到最上層的onCreate, 開始宣告這個class, 然後使用SQLitedatabase去使用
就可以創建好database和table了
SQLiteDB myDB = new SQLiteDB(this, "MyDB", null, 1);
final SQLiteDatabase db = myDB.getWritableDatabase();
其中SQLiteDB的建構子依序要帶入Context, "資料庫名稱", 指標工廠(用Null就可以了),
以及版本號(這邊通常會配合Update來控制版本, 不過這整篇的例子沒有特別用到)
9. 接著用DDMS就可以在/data/data/<package_name>/databases
發現剛剛建立好的DataBase, 然後Android會自動產生一個journal的檔案
10. 然後將MyDB匯出, 用sqliteman打開就可以看到剛建立好的DB和屬性
11. 接著介紹新增資料的方法, 需要用一個ContentValues的變數
然後用Key value的方式來塞值, 最後再用.insert的方法加入
這邊可以發現id的部分註解掉了, 因為在建造表格的時候
使用的是INTEGER PRIMARY KEY, 會自動生成
所以在這裡不需要去設值所已註解掉當做提醒
不註解表格還是可以建, 但log會有錯誤訊息
程式碼如下
ContentValues value = new ContentValues();
value.put("name", "test");
// value.put("id", 1);
value.put("age", 10);
db.insert("MyTable", null, value);
其中insert的參數依序是
table: "Table名稱",
nullColumnHack: 這個通常填Null
values: 要填的ContentValues的變數
12. 執行後再用sqliteman打開來看, 就可以看到新增了剛剛那筆資料
13. 接著介紹update, 也是需要用ContentValues來塞值
ContentValues newValue = new ContentValues();
newValue.put("age", 20);
db.update("MyTable", newValue, "id = 1", null);
Update的塞值只要塞需要變動的值就好了
然後帶的參數依序是
table: "表單名稱",
values: 修改後的值(也是以ContentValues的方式),
whereClause: 條件(語法中的where),
whereArgs: 條件中的變數值(舉例, 如果是id = ?, 這邊就是要塞?的值)
14. 執行後再把表單弄出來, 就可以看到age變成了20
15. 刪除delete的部分, 和update很像, 只需指定table名稱和條件就好了
db.delete("MyTable", "id = 1" ,null);
然後帶的參數依序是
table: "表單名稱",
whereClause: 條件(語法中的where),
whereArgs: 條件中的變數值(舉例, 如果是id = ?, 這邊就是要塞?的值)
16. 在查表就可以看到資料被刪除了
17. 然後用for迴圈連續建立10筆資料, 來方便接下來介紹查詢的方法
18. 在讀取表格確認建立成功
19. 查詢要使用Cursor(遊標), 並配合.query來使用, 最簡單的也是要帶一大堆參數
20. 然後就帶入參數,
Cursor c = db.query("MyTable", new String[]{"name", "id"},
"id >= ? and id <= ?", new String[]{"3", "6"}, null, null, "id desc");
參數的定義依序是
table: "表單名稱",
columns: "要查詢的欄位", 填null就代表全查,
selection: 條件, 也就是where,
selectionArgs: 條件內的變數值,
groupBy: 通常是null
having: 通常是null
orderBy: 升降冪排列方式
21. 設定完cursor後, 就要開始查詢了, 用.getCount()來取的row數(這邊是0~9條)
然後用getColumnCouunt()來取得一row有幾格欄位, 由於只查name和id, 所以這個例子是2
moveToFirst()故名思義, 就是將cursor移到最前面
moveToNext是將cursor移到下一row
getString(j)就是去取得cursor選取的該row的第j個值
接著就用迴圈依序來取得值並用Log顯示出來
最後記得用close()關掉cursor, 有開有關好習慣
database用完時也要記得關
程式碼如下
int row = c.getCount();
int col = c.getColumnCount();
c.moveToFirst();
for (int i = 0; i < row; i++) {
for(int j = 0; j < col; j++){
Log.d("MainActivity", c.getString(j));
}
c.moveToNext();
}
c.close();
22. 最後可以在Log看到查詢出來的資料值
補充一些一開始用DataBase可能會出現的錯誤經驗
a. 在不用塞值的部分給值
b. 塞了相同的值在primary key也就是唯一值的部分
c. 塞了錯誤的資料型式到需要的欄位值
當然還有其他的, 不過一開始這些還蠻需要注意的
下一篇[Android] 3-7 SQLite基礎 - 基礎API - 2介紹另一種API使用SQLite的的方式