如果需要一個更加健壯的資料存放區機制,則需要使用一個關係型資料庫,在Android上,則為SQLlite。
SQLite的特點:輕量級、嵌入式的、關係型資料庫。可移植性好,易使用,小,高效且可靠,與使用它的應用程式共用一個進程空間。
SQLite的缺點:不支援外鍵,需要手動利用觸發器控制。
我們先簡單的進行SQLite的操作學習:
9.3.1 資料庫的建立和使用
1. SQLite的建立
openOrCreateDatabase
openOrCreateDatabase("mydatabase.db",
SQLiteDatabase.CREATE_IF_NECESSARY,null);
程式碼片段9.3.1.1 SQLite資料庫建立
注釋:建立傳回值為SQLiteDatabase,通過這個類,可以進行一系列的資料庫操作,包括增刪改查。
2. SQLite執行SQL
SQLite可以直接執行SQL語句,不過它必須是執行語句,而非查詢語句,因為它不會返回任何結果。
this.sqLiteDatabase.execSQL(SQLStr.CREATE_USER_TABLE);
程式碼片段9.3.1.2 執行SQL建立表
注釋:SQLStr.CREATE_USER_TABLE為資料庫的建表語句:
public
static final String CREATE_USER_TABLE ="CREATETABLE user (id INTEGER PRIMARY KEY,name TEXT NOT NULL)";
程式碼片段9.3.1.3 SQL建表語句
3. 外鍵約束
這個是重點需要注意的,因為SQLite(3.6.19)並不支援外鍵。所以,在使用外鍵的時候,必須要注意,需要手動建立觸發器,在增加、修改、刪除這三種情況下,執行定義的外鍵觸發器才行。
因為在Android2.3左右,使用的sqlite為3.6.19以上版本,也就是它會支援外鍵約束,所以這裡的通過觸發器來自訂外鍵就不再描述。
4. 增加記錄
對於想表中增加資料,我們是通過建立一個ContentValues的對象,將需要插入的資料欄位名和值進行配對寫入。
ContentValues values = new ContentValues();
values.put("id", 1);
values.put("name",
"admin");
this.sqLiteDatabase.insert("user",null, values);
程式碼片段9.3.1.4 增加語句
注釋:insert語句有三個參數,分別代表為表名、values某列為空白時插入的值、傳入的列與值。
5. 更新記錄
對於需要表中需要修改的資料,只需要將對應的列和修改後的值,儲存到ContentValues就行。
ContentValues contentValues = new ContentValues();
contentValues.put("name",
"guest");
this.sqLiteDatabase.update("user", contentValues,"id=?",
new String[]{"1"});
程式碼片段9.3.1.5 更新語句
注釋:update有四個參數,分別對應為表明、需要更改的索引值對、where欄位、where欄位對應的值
6. 刪除記錄
刪除的操作也是類似。
this.sqLiteDatabase.delete("user","id=?",
new String[]{"1"});
程式碼片段9.3.1.6 刪除語句
7. 查詢記錄
查詢是通過query這個方法來進行,這個方法會返回一個遊標Cursor。
while(cursor.moveToNext()){
String id = String.valueOf(cursor.getInt(cursor.getColumnIndex("id")));
String name =cursor.getString(cursor.getColumnIndex("name"));
}
程式碼片段9.3.1.7 查詢語句
注釋:上述就是一個簡單的查詢,通過遊標的移動判斷是否存在下一個,之後通過列名查得列號,再根據列號來擷取該次迴圈所對應的列值。記住,每次查詢完畢都需要關閉cursor,即cursor.close()
一般查詢的參數如下(由左向右):
參數 |
描述 |
備忘 |
[String] |
執行查詢的表名稱 |
|
[String Array] |
返回的列名稱的列表 |
可以使用null,表示全部返回 |
[String] |
WHERE子語句 |
可以使用null,即無條件查詢,用“?”表示查詢參數 |
[String Array] |
查詢參數的值 |
當查詢子語句為null時,必須為null |
[String] |
GROUP BY子句 |
null表示無分組 |
[String] |
HAVING子句 |
當GROUP BY為null時,必須為null |
[String] |
ORDER BY子句 |
如果為null,則表示使用預設排序 |
[String] |
LIMIT子句 |
為null,則表示無限制 |
表9.3.1 查詢語句參數表
8. 複雜查詢
注意:對於複雜的查詢,有一下兩種方法,一種是通過SQLiteQueryBuilder類構建複雜查詢;另一種是通過rawQuery執行原生sql語句查詢。相對來說,rawQeruy的查詢比SQLiteQueryBuilder簡單
SQLiteQueryBuilder:
SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
builder.setTables("user, info");
builder.appendWhere("user.info=info.id");
String[] returnColumns = {
"user.id",
"user.name",
"info.sex"
};
String sortOrder = "user.id ASC";
Cursor cursor = builder.query(this.sqLiteDatabase,returnColumns,null,null,null,null,sortOrder);
StringBuffer buffer = new StringBuffer();
while(cursor.moveToNext()){
String id = String.valueOf(cursor.getInt(cursor.getColumnIndex("id")));
String name =cursor.getString(cursor.getColumnIndex("name"));
String sex =cursor.getString(cursor.getColumnIndex("sex"));
buffer.append("[id:"+id+","+"name:"+name+","+"sex:"+sex+"]"+"\r\n");
}
result.setText(buffer);
cursor.close();
程式碼片段9.3.1.8 SQLiteQueryBuilder語句
注釋:query的參數如下:
參數 |
描述 |
備忘 |
[SQLiteDatabase] |
資料庫 |
用來查詢的資料庫實體 |
[String Array] |
返回的列名數組 |
|
[String] |
WHERE 子句 |
查詢條件 |
[String Array] |
選擇條件對應的值 |
在條件為null是,必須為null |
[String] |
GROUP BY子句 |
null表示無分組 |
[String] |
HAVING子句 |
當GROUP BY為null時,必須為null |
[String] |
SORT ORDER |
排序欄位 |
表9.3.2 query的參數表
rawQuery:
public
static final String RAW_COMPLEX_QUERY ="SELECTuser.id,user.name,info.sex FROM user,info "
+ "WHEREuser.id=info.id ORDER BY user.id asc";
程式碼片段9.3.1.9 原生查詢語句
Cursor cursor = this.sqLiteDatabase.rawQuery(SQLStr.RAW_COMPLEX_QUERY,null);
StringBuffer buffer = new StringBuffer();
while(cursor.moveToNext()){
String id =
String.valueOf(cursor.getInt(cursor.getColumnIndex("id")));
String name =cursor.getString(cursor.getColumnIndex("name"));
String sex =cursor.getString(cursor.getColumnIndex("sex"));
buffer.append("[id:"+id+","+"name:"+name+","+"sex:"+sex+"]"+"\r\n");
}
result.setText(buffer);
cursor.close();
程式碼片段9.3.1.10原生SQL調用語句
注釋:rawQuery的參數如下:
參數 |
描述 |
備忘 |
[String] |
SQL語句 |
|
[String Array] |
WHERE ARGS |
條件查詢對應的值 |
表9.3.3 rawQuery參數
9.3.2 View中綁定資料
上述瞭解了如何進行資料查詢,現在可以通過Adapter適配器來進行資料的捆綁,讓其在View中展示,而不是如上只是簡單的顯示。
SQLiteQueryBuilder builder = newSQLiteQueryBuilder();
builder.setTables("user, info");
builder.appendWhere("user.info=info.id");
String[] returnColumns = {
"user.id as _id",
"user.name",
"info.sex"
};
String sortOrder = "user.id ASC";
Cursor cursor = builder.query(sqLiteDatabase,returnColumns,null,null,null,null,sortOrder);
startManagingCursor(cursor);
ListAdapter adapter = newSimpleCursorAdapter(this, R.layout.activity_listitem, cursor,
new String[]{"_id","name","sex"},
new
int[]{R.id.item_id,R.id.item_name,R.id.item_sex});
this.listView.setAdapter(adapter);
程式碼片段9.3.2.1 view中綁定資料
注釋:基本的查詢在上面已經描述過,在綁定到Adapter適配器的時候,需要注意必須要有一個_id列,如果沒有,可以通過別名將主鍵映射為_id
案例:
AndroidStudy_Database