ContentProvider

關於ContentProvider的一些知識點,在這裏總結一下:

1.ContentProvider簡介:

爲了在應用程序之間交換數據,Android提供了ContentProvider,ContentProvider是不同應用程序之間進行數據交換的標準的API。當一個應用程序需要把自己的數據暴露給其他的程序使用時,該應用程序就可通過提供ContentProvider來實現;其他的應用程序就可通過ContentResolver來操作ContentProvider暴露的數據。
ContentProvider也是Android應用的四大組件的之一,所以也需要在清單文件AndroidManifest.xml文件中進行配置。
寫一個簡單的ContentProvider的步驟:
  a. 定義自己的ContentProvider類,該類需要在繼承Android提供的ContentProvider的基類。
  b. 在AndroidManifest.xml文件中註冊這個ContentProvider,就像註冊Activity一樣。註冊ContentProvider時需要爲它綁定一個域名。
  向Android系統中註冊ContentProvider只要在<application/>元素下添加如下子元素即可:
  <!-- 下面配置中nane屬性指定ContentProvider類 authorities就相當於爲該ContentProvider指定域名 -->
  <Provider android:name=".MyProvider" android:authorities="com.infy.providers.myprovider"/>
 
  當向Android系統註冊了ContentProvider後,其他應用程序就可以通過Uri來訪問MyProvider所暴露的數據了。
 
  自定義的Myprovider類除了要繼承ContentProvider外,還要提供如下幾個方法,以方便其他應用程序來獲取自定義的Myprovider的數據,進行CRUD操作。
 
   public boolean onCreate():該方法在ContentProvider創建後會被調用,當其他應用程序第一次訪問ContentProvider時,該ContentProvider會被創建出來,並立即回調該onCreate()方法。
   public Uri insert(Uri uri,ContenValues values):根據Uri插入values對應的數據。
   public int delete(Uri uri,String selection,String[] selectionArgs):根據Uri 刪除select 條件所匹配的全部記錄。
   public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs,String sortOrder):根據Uri查詢出的select條件所匹配的全部記錄,其中projection就是一個列名列表,表明只選擇出指定的數據列。
   public String getType(Uri uri):該方法用於返回當前Uri所代表的數據的MIME類型。如果該Uri對應的數據可能包括多條記錄,那麼MIME類型字符串應該以vnd.android.cursor.dir/開頭;如果該Uri對應的數據只包含一條數據,那麼返回MIME類型字符串應該以vnd.android.cursor.item/開頭。
   
  2. Uri簡介:
   Android中的Uri如下:
   content://com.infy.providers.myprovider/words
   它有三部分:content://這個部分是Android規定的,是固定的。
               com.infy.providers.myprovider:這個部分是ContentProvider的authority。系統就是由這個部分來找到操作那個ContentProvider。如果要訪問指定的ContentProvider,這個部分也是固定的。
               words:資源部分(或者說數據部分),當訪問者需要訪問不同資源時,這個部分是動態改變的。
  爲了將一個字符串轉換成Uri,Android提供的Uri工具類提供了parse()靜態方法:如:
   Uri uri = Uri.parse("content://com.infy.providers.myprovider/word"); 

3.使用ContentProvider來操作數據
   其他應用程序可以通過ContentResolver來操作ContentProvider所暴露的數據。
   Context提供了下面的方法來獲取ContentResolver對象。
   getContentResolver():一旦在程序中獲得ContentResolver對象後,接下來就可調用ContentResolver的如下方法來操作數據。
     a. insert(Uri uri,ContentValues values):向Uri對應的ContentProvider中插入values對應的數據。
     b. delete(Uri uri,String where,String[] selectionArgs):刪除Uri對應的ContentProvider中where提交匹配的數據。
     c. update(Uri uri,ContentValues values,String where,String[] selectionArgs):更新Uri對應的ContentProvider中where提交匹配的數據。
     d. query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder):查詢Uri對應的ContentProvider中where提交匹配的數據。
   一般來說,ContentProvider是單例模式,當多個應用程序通過ContentResolver來操作ContentProvider提供的數據時,ContentResolver調用的數據操作將會委託給同一個ContentProvider來處理這些請求。
4.操作系統的ContentProvider:
   Android系統提供了大量的ContentProvider,允許我們來操作這些ContentProvider所暴露的數據。那麼使用ContentResolver來操作數據的步驟如下:
   a. 調用Activity的getContentResolver()獲取ContenResolver對象。
   b. 根據需要調用ContentResolver()的insert()、delete()、update()、query()方法操作數據即可。
   我們只需要瞭解系統提供的Uri即可。
  
5. 開發自己的ContentProvider
  (1.)創建ContentProvider的步驟:
    a. 開發一個ContentProvider的子類,該子類需要實現增、刪、改、查等方法。
    b. 在AndroidManifest.xml文件中註冊該ContentProvider。
   開發ContentProvider時所實現的增、刪、改、查等方法都需呀一個“Uri參數,該參數決定了對哪個Uri執行數據操作。
  爲了確定該ContentProvider實際能匹配的Uri,以及確定每個方法中Uri參數所操作的數據,Android系統提供了UriMatcher工具類。
  
  UriMatcher工具類提供瞭如下兩個方法:
   a. void addURL(String authority,String path,int code):該方法用於向UriMatcher對象註冊Uri.其中authority 和 path組合成一個Uri,而code則代表該Uri對應的標識碼。
   b. int match(Uri uri):根據前面註冊的 Uri 來判斷指定Uri對應的標識碼。如果找不到匹配的標識碼,該方法將返回-1.
   到底要爲UriMatcher對象註冊多少個Uri,取決於系統的業務需求。
  
   另外,Android還提供了一個ContentUri工具類,它是一個操作Uri字符串的工具類。有如下兩個方法:
    a. withAppendedId(uri,id):用於爲路徑加上ID部分。例如:
    Uri uri = Uri.parse("content://com.infy.providers.myprovider/word");  
    Uri resultUri = ContentUris.withAppendedId(uri,2);
   生成後爲Uri爲:"content://com.infy.providers.myprovider/word/2"
    b. parseId(uri):用於從指定的Uri中解析出所包含的ID的值。
      例如:Uri uri = Uri.parse("content://com.infy.providers/myproviders/word/2");
            long wordId = ContentUri.parseId(uri);
         生成的結果爲:2
  
6. 監聽ContentProvider的數據改變
    當ContentProvider的數據共享後,ContentResolver會很據業務需要去主動查詢ContentProvider所共享的數據。當需要實時監聽ContentProvider的數據的改變而提供相應的響應的時候,就需要利用ContentObserver了
    監聽ContentProvider的數據改變的監聽器需要繼承ContentObserver類,並重寫該基類的onChange(boolean selfChange) 方法---當它監聽的ContentProvider的數據發生改變時,該onChange將會被觸發。 
    爲了監聽指定的ContentProvider數據的變化,需要通過ContentResolver向指定Uri註冊ContentObserver監聽器,ContentResolver提供瞭如下的方法來註冊監聽器:
    registerObserver(Uri uri,boolean notifyForDescendents,ContentObserver observer) 
發佈了68 篇原創文章 · 獲贊 5 · 訪問量 44萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章