如果需要一個更加健壯的數據存儲機制,則需要使用一個關係型數據庫,在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
案例: