ContentResolver使用方法

這個類主要是Android用來實現應用程序之間數據共享的

 

一個應用程序可以將自己的數據完全暴露出去,外界更本看不到,也不用看到這個應用程序暴露的數據是如何存儲的,或者是使用數據庫還是使用文件,還是通過網上獲得,這些一切都不重要,重要的是外界可以通過這一套標準及統一的接口和這個程序裏的數據打交道,例如:添加(insert)、刪除(delete)、查詢(query)、修改(update),當然需要一定的權限纔可以。

 

一個程序可以通過實現一個Content provider的抽象接口將自己的數據完全暴露出去,而且Content providers是以類似數據庫中表的方式將數據暴露。Content providers存儲和檢索數據,通過它可以讓所有的應用程序訪問到,這也是應用程序之間唯一共享數據的方法。

 

要想使應用程序的數據公開化,可通過2種 方法:

1)創建一個屬於你自己的Content provider

2)將你的數據添加到一個已經存在的Content provider中,前提是有相同數據類型並且有寫入Content provider的權限

 

什麼是URI?

在學習如何獲取ContentResolver前,有個名詞是必須瞭解的:URI。URI是網絡資源的定義,在Android中賦予其更廣闊的含義,先看個例子,如下:
URI

 

 

將其分爲A,B,C,D 4個部分:
A:標準前綴,用來說明一個Content Provider控制這些數據,無法改變的;


B:URI的標識,它定義了是哪個Content Provider提供這些數據。對於第三方應用程序,爲了保證URI標識的唯一性,它必須是一個完整的、小寫的   類名。這個標識在<provider> 元素的 authorities屬性中說明:
<provider name=”.TransportationProvider”  authorities=”com.example.transportationprovider”  . . .  >


C:路徑,Content Provider使用這些路徑來確定當前需要生什麼類型的數據,URI中可能不包括路徑,也可能包括多個;


D:如果URI中包含,表示需要獲取的記錄的ID;如果沒有ID,就表示返回全部;


由於URI通常比較長,而且有時候容易出錯,切難以理解。所以,在Android當中定義了一些輔助類,並且定義了一些常量來代替這些長字符串,例如:People.CONTENT_URI

 

ContentResolver 介紹說明

看完這些介紹,大家一定就明白了,ContentResolver是通過URI來查詢ContentProvider中提供的數據。除了URI以 外,還必須知道需要獲取的數據段的名稱,以及此數據段的數據類型。如果你需要獲取一個特定的記錄,你就必須知道當前記錄的ID,也就是URI中D部分。

 

前面也提到了Content providers是以類似數據庫中表的方式將數據暴露出去,那麼ContentResolver也將採用類似數據庫的操作來從Content providers中獲取數據。現在簡要介紹ContentResolver的主要接口,如下:

 

返回值 函數聲明
final Uri insert (Uri url, ContentValues values)Inserts a row into a table at the given URL.
final int delete (Uri url, String where, String[] selectionArgs)Deletes row(s) specified by a content URI.
final Cursor query (Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)Query the given URI, returning a Cursor over the result set.
final int update (Uri uri, ContentValues values, String where, String[] selectionArgs)Update row(s) in a content URI.

 

 

可能還有2個問題,是需要關注的。

  1. ContentProvider是什麼時候創建的,是誰創建的?訪問某個應用程序共享的數據,是否需要啓動這個應用程序?這個問題在 Android SDK中沒有明確說明,但是從數據共享的角度出發,ContentProvider應該是Android在系統啓動時就創建了,否則就談不上數據共享了。 這就要求在AndroidManifest.XML中使用<provider>元素明確定義。

 2. 可能會有多個程序同時通過ContentResolver訪問一個ContentProvider,會不會導致像數據庫那樣的“髒數據”?這個問題一方面需要數據庫訪問的同步 , 尤其是數據寫入的同步,在AndroidManifest.XML中定義ContentProvider的時候,需要考慮 是<provider>元素multiprocess屬性的值;另外一方面Android在ContentResolver中提供了 notifyChange()接口,在數據改變時會通知其他ContentObserver,這個地方應該使用了觀察者模式,在 ContentResolver中應該有一些類似register,unregister的接口。

發佈了8 篇原創文章 · 獲贊 24 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章