close

這篇介紹Andorid裡面內建好的套裝SQLite API

會配合sqlteman的工具來對照內容

 

1. 首先可以到官網爬爬database的文件

http://developer.android.com/reference/android/database/package-summary.html

然有有提到所有的database都會存在裝置的/data/data/<package_name>/databases

01.png

 

2. 首先建立一個專案, 以testsqlite為例, 然後用DDMS進到/data/data/com.example.testsqlite

可以發現, 沒有databases的資料夾, 這是正常的, 因為還沒有開始使用

02.png

 

3. 創建一個SQLite的DataBase, 必須要宣告一個class來繼承SQLiteOpenHelper,

這邊以創建SQLiteDB然後繼承SQLiteOpenHelper,

然後在新增內建的建構子constructor

03.png

 

4. 然後在Add unimplemented methods

04.png

5. 接著宣告table的名稱字串, 當然依照code的使用, 會有更好的宣告位置

05.png  

 

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); 執行

06.png

 

7. 接著在onUpgrade的方法中, 選擇要處理的動作

這邊基本上也可以不寫, 通常會使用砍掉並重新建造的方式

以下為例

   final String drop = "DROP TABLE " + tableName;
   db.execSQL(drop);
   onCreate(db);

07.png

 

8. 然後回到最上層的onCreate, 開始宣告這個class, 然後使用SQLitedatabase去使用

就可以創建好database和table了

  SQLiteDB myDB = new SQLiteDB(this, "MyDB", null, 1);
  final SQLiteDatabase db = myDB.getWritableDatabase();

其中SQLiteDB的建構子依序要帶入Context, "資料庫名稱", 指標工廠(用Null就可以了),

以及版本號(這邊通常會配合Update來控制版本, 不過這整篇的例子沒有特別用到)

08.png

9. 接著用DDMS就可以在/data/data/<package_name>/databases

發現剛剛建立好的DataBase, 然後Android會自動產生一個journal的檔案

09.png

 

10. 然後將MyDB匯出, 用sqliteman打開就可以看到剛建立好的DB和屬性

10.png

 

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的變數

11.png  

 

12. 執行後再用sqliteman打開來看, 就可以看到新增了剛剛那筆資料

12.png

 

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 = ?, 這邊就是要塞?的值)

13.png

 

14. 執行後再把表單弄出來, 就可以看到age變成了20

14.png

 

15. 刪除delete的部分, 和update很像, 只需指定table名稱和條件就好了

db.delete("MyTable", "id = 1" ,null);

然後帶的參數依序是

table: "表單名稱",

whereClause: 條件(語法中的where),

whereArgs: 條件中的變數值(舉例, 如果是id = ?, 這邊就是要塞?的值)

 

15.png

 

16. 在查表就可以看到資料被刪除了

16.png

 

17. 然後用for迴圈連續建立10筆資料, 來方便接下來介紹查詢的方法

17.png

 

18. 在讀取表格確認建立成功

18.png

 

19. 查詢要使用Cursor(遊標), 並配合.query來使用, 最簡單的也是要帶一大堆參數

19.png

 

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: 升降冪排列方式

20.png

 

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

 

21.png

 

22. 最後可以在Log看到查詢出來的資料值

22.png  

 

補充一些一開始用DataBase可能會出現的錯誤經驗

a. 在不用塞值的部分給值

b. 塞了相同的值在primary key也就是唯一值的部分

c. 塞了錯誤的資料型式到需要的欄位值

當然還有其他的, 不過一開始這些還蠻需要注意的

 

下一篇[Android] 3-7 SQLite基礎 - 基礎API - 2介紹另一種API使用SQLite的的方式

arrow
arrow
    文章標籤
    Android SQLite
    全站熱搜
    創作者介紹
    創作者 RX1226 的頭像
    RX1226

    給你魚竿

    RX1226 發表在 痞客邦 留言(1) 人氣()