ContentProvider數(shù)據(jù)共享
在某些情況下,Android應(yīng)用程序需要對外暴露自己的數(shù)據(jù),以便其他應(yīng)用程序進(jìn)行訪問,從而完成系統(tǒng)中不同Android應(yīng)用程序之間的數(shù)據(jù)共享,這就需要使用ContentProvider。
ContentProvider是不同應(yīng)用程序之間進(jìn)行數(shù)據(jù)交換的標(biāo)準(zhǔn)API,也是所有應(yīng)用程序之間數(shù)據(jù)存儲和檢索的橋梁。
ContentProvider類中的數(shù)據(jù)操作方法多數(shù)為抽象方法,需要實(shí)現(xiàn)這些方法;方法中用到Uri參數(shù)
Uri是ContentProvider對外提供一個自身數(shù)據(jù)集的唯一標(biāo)識
ContentProvider將會為每個數(shù)據(jù)集分配一個獨(dú)立且唯一的Uri
UriMatcher工具類對Uri進(jìn)行匹配判斷,該工具類提供了兩個方法∶
void addURI(String authority,String path,int code)
用于注冊Uri
authority和path組合成一個Uri ; Code代表Uri對應(yīng)的標(biāo)識碼
int match(Uri uri)
根據(jù)前面注冊的Uri判斷指定的Uri對應(yīng)的標(biāo)識碼,如果找不到匹配的標(biāo)識碼則返回-1
ContentUris工具類,用于操作Uri字符串,該工具類提供了兩個方法∶
withAppendedld(uri,id)∶用于為Uri路徑加上ID部分
parseld(uri)∶用于從指定的uri中解析出所包含的lD值
ContentResolver用來間接操作ContentProvider中的數(shù)據(jù)
通過Context的getContentResolver()方法來獲取ContentResolver實(shí)例對象
ContentProvider程序
開發(fā)ContentProvider程序的步驟︰
創(chuàng)建一個ContentProvider子類,實(shí)現(xiàn)增刪改查等抽象方法;
在AndroidManifest.xml配置文件中注冊ContentProvider,并指定android:authorities屬性;
通過Activity使用ContentProvider。Activity和Service等組件都可以獲取ContentProvider對象,并調(diào)用該對象相應(yīng)的方法進(jìn)行操作。
創(chuàng)建ContentProvider子類
?//創(chuàng)建一個繼承于contentProvider的類
?public class FirstProvider extends ContentProvider {
?//第一次創(chuàng)建該coontentProvide時調(diào)用該方法
?override
?public boolean onCreate ( ) {
?Log.i ( "FirstProvider" , "===onCreate方法被調(diào)用===") ;return true;
?)
?...--
?ContentProvider子類中實(shí)現(xiàn)query()方法(2/7 )
?..…
?<!--實(shí)現(xiàn)查詢方法,該方法返回查詢得到的cursor -->
? ? ?@override
?public Cursor query(Uri uri,string[] projection,string where,string []whereArgs,string sortorder) {
?Log.i ( "FirstProvider" , "===query方法被調(diào)用===") ;
?Log.i("FirstProvider" , "uri參數(shù)為: "+uri+"where參數(shù)為: "+where) ;return null;
?ContentProvider子類中實(shí)現(xiàn)insert()方法
?<!--實(shí)現(xiàn)插入的方法,該方法應(yīng)該返回新插入的記錄的uri -->
? ? ?@override
?public Uri insert (Uri uri, Contentvalues values) {
?Log.i ( "FirstProvider" , "===insert方法被調(diào)用===") ;Log.i("FirstProvider" , "values參數(shù)為: "+values ) ;return uri;
?)
?ContentProvider子類中實(shí)現(xiàn)update()方法
?<! --實(shí)現(xiàn)更新方法,該方法應(yīng)該返回被更新的記錄條數(shù)-->
? ? ?@override
?public int update(Uri uri,Contentvalues values,string where,
?string [ ] whereArgs) {
?Log.i ( "FirstProvider" , "===update方法被調(diào)用===") ;
?Log.i ( "FirstProvider", "where參數(shù)為:"+where+" , values參數(shù)為:"+values) ;
?return l;
?}
?ContentProvider子類中實(shí)現(xiàn)delete()方法
?<! --實(shí)現(xiàn)刪除方法,該方法應(yīng)該返回被刪除的記錄條數(shù)-->
? ? ?@override
?public int delete(Uri uri,string where,string [ ] whereArgs){
?Log.i ( "FirstProvider" , "===delete方法被調(diào)用===" ) ;
?Log.i ( "FirstProvider" , "where參數(shù)為: "+where) ;return l;
?)
?使用
<provider>
子元素注冊ContentProvider?<!--注冊一個contentProvider -->
?<provider
?android : name=". FirstProvider"
?android:authorities="com.qst.chapter07.Firstprovider"android:exported="true">
?</provider>
?name屬性指定ContentProvider的實(shí)現(xiàn)類
authorities屬性指定該ContentProvider對應(yīng)的Uri
exported屬性指定該ContentProvider是否允許其他應(yīng)用調(diào)用
使用ContentProvider操作數(shù)據(jù)
?Uri uri=Uri.parse ( "content : / / com.qst.chapter08.firstprovider/ " );
?ContentResolver contentResolver=getContentResolver ( );…-
?cursor
?c=contentResolver. query (uri, null , "query_where" , null,null);...
?Uri newUri=contentResolver.insert(uri, values) ;
?contentResolver.update (uri, values, "update_where" , null);
?contentResolver.delete (uri , "delete_where" , null) ;
?
操作系統(tǒng)的ContentProvider
Android系統(tǒng)本身提供了大量的ContentProvider,例如聯(lián)系人信息、系統(tǒng)的多媒體信息等。
開發(fā)人員可以通過ContentResolver來調(diào)用系統(tǒng)ContentProvider所提供的增刪改查方法來對Android內(nèi)部數(shù)據(jù)進(jìn)行操作。
Android系統(tǒng)用于管理聯(lián)系人的ContentProvider的Uri有以下三種:
ContactsContract.Contacts.CONTENT_URI∶管理聯(lián)系人的Uri
ContactsContract.CommonDataKinds.Phone.CONTENT_URI∶管理聯(lián)系人的電話Uri
ContactsContract.CommonDataKinds.Email.CONTENT_URI∶管理聯(lián)系人的E-mail的Uri
Android系統(tǒng)為多媒體提供了相應(yīng)的ContentProvider的Uri :
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI∶存儲在外部SD存儲卡中的音頻文件的Uri
MediaStore.Audio.Media.INTERNAL_CONTENT_URI∶存儲在手機(jī)內(nèi)存中的音頻文件的Uri
MediaStore.Images.Media.EXTERNAL_CONTENT_URI∶存儲在外部SD存儲卡中的圖片文件的Uri