內容提供器的用法一般有兩種,一種是使用現有的內容提供器來讀取和操作響應程序的數據,另一種是創建自己內容提供器給我們程序的數據提供外部訪問接口。
ContentResolver的基本用法
對於一個應用,要訪問內容提供器中共享的數據,就一定要藉助ContentResolver類,可以通過Context中的getContentResolver()方法獲取該類的勢力,其中提供一系列方法對數據進行操作,其中insert()用於添加數據,update()用於更新數據,delete()用於刪除數據,query()用於更新數據。
不同於SQLiteDatabase,該類中增刪改查方法不接受表名參數,而使用uri參數代替,內容URI給內容提供器中的數據建立了唯一標識符,由authority和path組成。authority適用於對不同的應用進行區分的,比如一個程序的包名是com.xxx.app那麼該程序的authority可以命名爲com.xxx.app.provider。path是對同一個應用中不同的表做區分的eg:com.xxx.app.provider/table1和com.xxx.app.provider/table2
因此內用URI最標準的格式寫法如下:content://com.example.app.provider/table1
在得到了內容URI字符串之後,我們還需要將它解析成Uri對象纔可以作爲參數傳入
eg:Uri uri = Uri.parse("content://com.example.app.provider/table1");
只需要調用Uri.parse()方法就可以將URI字符串解析成Uri對象了
我們就可以使用這個Uri對象來查詢table1中的數據了
Cursor cursor = getContentResolver().query(
uri,
projection,
selection,
selectionArgs,
sortOrder);
查詢完成後返回的仍然是一個Cursor對象,這時我們就可以將數據從Cursor對象中逐個讀取出來了。讀取的思路是通過移動遊標的位置來遍歷Cursor的所有行,然後再去出每一個行中相應列的數據,代碼如下
if (cursor!=null){
while (cursor.moveToNext()){
String colume1 = cursor.getString(cursor.getColumnIndex("column1"));
int colume2 = cursor.getInt(cursor.getColumnIndex("column2"));
}
cursor.close();
}
增添一條數據
ContentValues values = new ContentValues();
values.put("column1","text");
values.put("column2",1);
getContentResolver().insert(uri,values);
更新數據,藉助ContentResolver的update()方法來實現
ContentValues values = new ContentValues();
values.put("column1","");
getContentResolver().update(uri,values,"column1=?andcolumn2=?",new String[]{"text",1});
刪除數據
getContentResolver().delete(uri,"column2=?",new String[]{"1"});