访问其他程序中的数据(ContentResolver的CRUD操作)
內容提供器的用法一般有兩種:
1.使用現有的內容提供器來讀取和操作相應程序中的數據
2.創建自己的內容提供器給我們程序的數據提供外部訪問接口。
如果一個應用程序通過內容提供器對其數據提供了外部訪問接口,那么任何其他的應用程序既可以對這部分數據進行訪問。Android系統中自帶的電話薄、短信、媒體庫等程序都提供了類似的訪問接口,這就使得第三方應用程序可以充分地利用這部分數據來實現更好的功能。
?
ContentResolver的基本用法
對于每一個應用程序來說,如果想要訪問內容提供器中共享的數據,就一定要借助ContentResolver類,可以通過Context中的getContentResolver()方法獲取到該類的實例。ContentResolver中提供了一系列的方法用于對數據進行CRUD操作,其中insert()方法用于添加數據,update()方法用于更新數據,delete()方法用于刪除數據,query()方法用于查詢數據。這和SQLiteDatabase中的CRUD操作還是有點區別的。
不同于SQLiteDatabase,ContentResolver中的增刪改查方法都是不接收表名參數的,而是使用一個Uri參數代替,這個參數被稱為內容URI。內容URI給內容提供器中的數據建立了唯一標識符,它主要由兩部分組成:authority和path。
authority:用于對不同的應用程序做區分的,一般為了避免沖突,都會采用程序包名的方式來進行命名。比如某個程序的包名com.example.app,那么該程序對應的authority就可以命名為com.example.app.provider。
path:用于對同一應用程序中不同的表做區分的,通常都會添加到authority的后面。比如某個程序的數據庫里存在兩張表table1和table2,這時就可以將path分別命名為/table1和/table2,然后把authority和path進行組合,內容URI就變成了com.example.app.provider/table1和com.example.app.provider/table2。
不過,目前還很難辨別出這兩個字符串就是兩個內容URI,我們還需要在字符串的頭部加上協議聲明。因此,內容URI最標準的格式寫法如下:
協議名://包名.provider/表名
例:
content://com.example.app.provider/table1
content://com.example.app.provider/table2
有沒有發現,內容URI可以非常清楚地表達出我們想要訪問哪個程序中的哪張表里的數據。也正因此,ContentResolver中的增刪改查方法才都接收Uri對象作為參數,因為如果使用表名的話,系統將無法得知我們期望訪問的是哪個應用程序里的表。
在得到了URI字符串之后,我們還需要將它解析成Uri對象才可以作為傳入。
解析方法:
Uri uri=Uri.pare("content://com.example.app.provider/table1");只需要調用Uri.parse()方法,就可以將內容URI字符串解析成Uri對象了。
現在我們就可以使用這個Uri對象來查詢table1表中的數據了,代碼如下所示:
Cursor cursor=getContentResolver().query(uri,projection,selection,selectionArgs,sortOrder);uri:指定查詢某個應用程序下的某一張表
projection:指定查詢的列名(select column1,column2)
selection:指定where的約束條件(where column = value)
selectionArgs:為where中的占位符提供具體的值
sortOrder:指定查詢結果的排序方式(order by column1,column2)
查詢完成后返回的仍然是一個Cursor對象,這時我們就可以將數據從Cursor對象中逐個讀取出來了。讀取的思路仍然是通過移動游標的位置來遍歷Cursor的所有行,然后再取出每一行中相應列的數據,代碼如下所示:
if(cursor != null){while(cursor.moveToNext()){String column1=cursor.getString(cursor.getColumnIndext("column1"));int column2=cursor.getInt(cursor.getColumnIndext("column2"));}cursor.close();}掌握了最難的查詢操作,剩下的增刪改操作就比較容易了。
增加數據:
ContentValues cv=new ContentValues();cv.put("column1","text);cv.put("column2",1);getContentResolver().insert(uri,cv);?
更新數據:
ContentValues cv=new ContentValues();cv.put("column1","");getContentResolver().update(uri,cv,"column1 = ? and column2 = ?",new String[]{"text","1"});注意上述代碼使用了selection和selectionArgs參數來對想要更新的數據進行約束,以防止所有的行都會受影響。
?
刪除數據:
getContentResolver().delete(uri,"column2 = ?",new String[] {"1"});這句話的意思是將column2列中,值為1的這一行數據給刪除。
總結
以上是生活随笔為你收集整理的访问其他程序中的数据(ContentResolver的CRUD操作)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 辽宁丹东抗美援朝纪念馆自助参观导引
- 下一篇: 运行时权限+读取系统联系人