使用ContentProvider是通過Android組件都具有的ContentResolver對象,通過Uri進(jìn)行數(shù)據(jù)操作。程序開發(fā)人員只需要知道Uri和數(shù)據(jù)集的數(shù)據(jù)格式,則可以進(jìn)行數(shù)據(jù)操作,解決不同應(yīng)用程序間的數(shù)據(jù)共享問題。
每個(gè)Android組件都具有一個(gè)ContentResolver對象,獲取ContentResolver對象的方法是調(diào)用getContentResolver()方法。
代碼清單7-53 獲取ContentResolver對象
ContentResolver resolver = getContentResolver();
1.查詢操作
在獲取到ContentResolver對象后,程序開發(fā)人員則可以使用query()方法查詢目標(biāo)數(shù)據(jù)。代碼清單7-54所示的代碼是查詢ID為2的數(shù)據(jù)。
代碼清單7-54 獲取ContentResolver對象
String KEY_ID = "_id";
String KEY_NAME = "name";
String KEY_AGE = "age";
String KEY_HEIGHT = "height";
Uri uri = Uri.parse(CONTENT_URI_STRING + "/" + "2";
Cursor cursor = resolver.query(uri,
new String[] {KEY_ID, KEY_NAME, KEY_AGE, KEY_HEIGHT},
null, null, null);
在Uri中定義了需要查詢數(shù)據(jù)的ID,在query()方法并沒有額外聲明查詢條件。
如果需要獲取數(shù)據(jù)集中的全部數(shù)據(jù),則可直接使用CONTENT_URI,此時(shí)ContentProvider在分析Uri時(shí)將認(rèn)為需要返回全部數(shù)據(jù)。ContentResolver的query()方法與SQLite數(shù)據(jù)庫的query()方法非常相似,語法結(jié)構(gòu)如代碼清單7-55所示。
代碼清單7-55 ContentResolver的query()方法語法
Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder)
其中,uri定義了查詢的數(shù)據(jù)集;projection定義了從數(shù)據(jù)集返回哪些數(shù)據(jù)項(xiàng);selection定義了返回?cái)?shù)據(jù)的查詢條件;selectionArgs是對應(yīng)的實(shí)際查詢條件;sortOrder是排序方式。
2.添加操作
向ContentProvider中添加數(shù)據(jù)有兩種方法:一種是使用insert()方法,向ContentProvider中添加一條數(shù)據(jù);另一種是使用bultInsert()方法,批量地添加數(shù)據(jù)。
代碼清單7-56所示的代碼說明了如何使用insert()方法添加單條數(shù)據(jù)。
代碼清單7-56 使用insert()方法添加單條數(shù)據(jù)
ContentValues values = new ContentValues();
values.put(KEY_NAME, "Tom");
values.put(KEY_AGE, 21);
values.put(KEY_HEIGHT, );
Uri newUri = resolver.insert(CONTENT_URI, values);
代碼清單7-57所示的代碼說明了如何使用bultInsert()方法添加多條數(shù)據(jù)。
代碼清單7-57 使用bultInsert()方法添加多條數(shù)據(jù)
ContentValues[] arrayValues = new ContentValues[10];
//實(shí)例化每一個(gè)ContentValues
int count = resolver.bultInsert(CONTENT_URI, arrayValues);
3.刪除操作
刪除操作需要使用delete()方法。如果需要?jiǎng)h除單條數(shù)據(jù),則可以在Uri中指定需要?jiǎng)h除數(shù)據(jù)的ID;如果需要?jiǎng)h除多條數(shù)據(jù),則可以在selection中聲明刪除條件。
代碼清單7-58所示的代碼說明了如何刪除ID為2的數(shù)據(jù)。
代碼清單7-58 刪除ID為2的數(shù)據(jù)
Uri uri = Uri.parse(CONTENT_URI_STRING + "/" + "2");
int result = resolver.delete(uri, null, null);
也可以在selection中將刪除條件定義為ID大于4的數(shù)據(jù),如代碼清單7-59所示。
代碼清單7-59 刪除條件定義為ID大于4的數(shù)據(jù)
String selection = KEY_ID + “>4”;
int result = resolver.delete(CONTENT_URI, selection, null);
4.更新操作
更新操作需要使用update()方法,參數(shù)定義與delete()方法相同,同樣可以在Uri中指定需要更新數(shù)據(jù)的ID,也可以在selection中聲明更新條件。
代碼清單7-60所示的代碼說明了如何更新ID為7的數(shù)據(jù)。
代碼清單7-60 更新ID為7的數(shù)據(jù)
ContentValues values = new ContentValues();
values.put(KEY_NAME, "Tom");
values.put(KEY_AGE, 21);
values.put(KEY_HEIGHT, );
Uri uri = Uri.parse(CONTENT_URI_STRING + "/" + "7");
int result = resolver.update(uri, values, null, null);