1. 程式人生 > >ContentProvider和ContentResolve

ContentProvider和ContentResolve

一、前言                                                                                     

        在Android平臺中,各個Android 應用中可能需要互相傳遞資料。而ContentProvider類的作用就是在不同的應用之間進行資料的傳遞。

二、URI簡介                                                                                

       URI在AndroidContentProvider中很重要,URI類似於網路中的URL,是一條字串用於儲存資訊,或儲存資訊的地址。

   對於一個URI:

  content://com.milkz.providers.mytest/messages

Uri uri = Uri.parse(content://com.milkz.providers.mytest/messages);

content://    <----   Android中規定的部分書寫,類似於URL中的HTTP

com.milkz.providers.mytest <------ 該部分為AndroidContentProvider的authorities。繼承自ContentProvider的

類的包的路徑。

messages <------ 訪問的資料  

三、ContentProvider簡介                                                          

       ContentProvider需要自定義一個Class去繼承(有的公司API可能會把ContentProvider改成一個abstract,此時就需要使用者靈活改變了),假設這個自定義的類名為myContentProvider,這個定義的類的作用就是為了向其他應用提供資訊的類。類似於給BroadCastReciver傳送廣播通知的系統廣播,myContentProvider就是向外散發一個資訊,然後對它感興趣的類會去獲取這個資訊。ContentProvider向外傳送的資訊主要通過URI來發送,將一些資訊封裝在URI中,傳送出去。

       繼承於ContentProvider的類需要重寫(有的公司的API修改了Google原生程式碼,可能就是實現介面了) 【ContentProvider中的六個方法】

        boolean onCreate()

和activity、service一樣,ContentProvider也需要一個onCreate()來對資料進行初始化,但是在該方法中,同樣不可進行大量的邏輯運算,防止造成執行緒阻塞。但是onCreate只會啟動一次。該方法會在ContentProvider建立的時候被呼叫,當其他應用第一次訪問時,ContentProvider會被建立並且會呼叫該方法。

        public Uri insert(Uri uri,ContentValues values) 

uri:訊息封裝的uri

values:該URI對應的值

用於向URI中插入訊息

        public int delete (Uri uri,String selection,String[] selectionArgs)

刪除某條訊息

public int update(Uri uri,ContentValues values,String selection,Stringp[] selectionArgs)

更新訊息

        public Cursor query(Uri uri,String[] projection ,String selectiion,String[] selectionArgs,String sortOrder)

類似於對資料庫的操作,使用遊標對資料進行一系列操作。通過獲取遊標來讀取URI中的內容

        public String getType(Uri uri)

返回當前uri所代表的資料MIME型別。

字串以 vnd.android.cursor.dir/ 開頭: 該URI包含多條記錄

字串以 vnd.android.cursor.item/ 開頭: 該URI只包含一條記錄

四、ContentResolver                                                               

       ContentProvider是傳送URI,對應的ContentResolver是用來接收資訊並進行處理的,相比之下,ContentResolver並不需要太多的操作,直接在Content中使用getContentResolver() 來獲取預設的ContentResolver物件。

         該物件直接操作URI對應的ContentProvider中的方法,故它屬於單例模式。一個Android原始碼中有大量的COntentProvider和ContentResolver,而URI就是連線對應的Provider和Resolver的利器。

五、在Androidmanifest中配置                                                 

<provider

android:name=".myProvider"    <-----   類的名字

android:authorities="com.milkz.mYprovider"     <------ 類的包名

android:

android:exported="true" />     <-----   該ContentProvider是否可以被其他應用呼叫。

六、URI工具類                                                                       

1)UriMatcher <-----  判斷該URI能否被當前的ContentProvider處理

void addURI(String authority,String path,int code)   

向URI中新增內容,也可以理解為註冊URI,一個URI可以包含多個記錄

authority+path = URI

  code : 標識碼

int match(Uri uri)

返回URI匹配的標識碼,如果找不到則返回-1

使用:

String s = content://com.milkz.providers.mytest/messages;

UriMatcher matcher = new uriMatcher(UriMatcher.NO_MATCH);

matcher.addURI(s,message,1);

int a = matcher.match(Uri.parce(s)); // a =1

matcher.addURI(s,message/#,1);//此處#代表任意的標識碼

int b = matcher.match(Uri.parce(s/1));//b = 1

2) ContentUris <-----  操作Uri字串的工具類

withAppendedld(URI uri,int id)

為uri加上id,即標識碼

parseId(URI uri) 

從指定的uri中解析出id