一、Content Provider基本概念
1、ContentProvider爲存儲和獲取數據提供了統一的接口。ContentProvide對數據進行封裝,不用關心數據存儲的細節。使用表的形式來組織數據。
2、使用ContentProvider可以在不同的應用程序之間共享數據。
3、Android爲常見的一些數據提供了默認的ContentProvider(包括音頻、視頻、圖片和通訊錄等)。
ContentProvider所提供的函數:
query(),insert(),update(),delete(),getType(),onCreate()等。
二、URI(統一資源標識符)的使用方法
爲系統的每一個資源給其一個名字,比方說通話記錄。
1、每一個ContentProvider都擁有一個公共的URI,這個URI用於表示這個ContentProvider所提供的數據。
2、Android所提供的ContentProvider都存放在android.provider包中。 將其分爲A,B,C,D 4個部分:
A:標準前綴,用來說明一個Content Provider控制這些數據,無法改變的;"content://"
B:URI 的標識,它定義了是哪個Content Provider提供這些數據。對於第三方應用程序,爲了保證URI標識的唯一性,它必須是一個完整的、小寫的 類名。這個標識在 元素的 authorities屬性中說明:一般是定義該ContentProvider的包.類的名稱;"content://hx.android.text.myprovider"
C:路徑,不知道是不是路徑,通俗的講就是你要操作的數據庫中表的名字,或者你也可以自己定義,記得在使用的時候保持一致就ok了;"content://hx.android.text.myprovider/tablename"
D:如果URI中包含表示需要獲取的記錄的ID;則就返回該id對應的數據,如果沒有ID,就表示返回全部;"content://hx.android.text.myprovider/tablename/#" #表示數據id
三、ContentProvider的實現過程
自己實現ContentProvider不常見,因爲可能不需要和別的應用程序交換數據。使用內置的ContentProvider比較多。
1、定義一個CONTENT_URI常量,提供了訪問ContentProvider的標識符。
public static final Uri CONTENT_URI =Uri.parse("content://com.example.codelab.transportationprovider");
其中:content是協議
Com.exmaple.codelab.transportationprovider是類名,包含完整的包名。
Uri.parse將一個字符串轉換成Uri類型。
如果Provider包含子表,同樣定義包含字表的CONTENT_URI。
content://com.example.codelab.transportationprovider/train
content://com.example.codelab.transportationprovider/air/domestic
content://com.example.codelab.transportationprovider/air/international
然後定義列,確保裏面包含一個_id的列。
2、定義一個類,繼承ContentProvider。
public class FirstContentProvider extends ContentProvider
先介紹一下ContentProvider用到的UriMatcher。UriMatcher的一個重要的函數是match(Uri uri)。這個函數可以匹配Uri,根據傳入的不同Uri返回不同的自定義整形值,以表明Uri訪問的不同資源的類型。
例如:
public static final UriMatcher uriMatcher;
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(Book.AUTHORITY, "item", Book.ITEM);
uriMatcher.addURI(Book.AUTHORITY, "item/#", Book.ITEM_ID);
}
這裏UriMatcher類型的靜態字段是用來匹配傳入到ContentProvider中的Uri的類。其構造方法傳入的匹配碼是使用match()方法匹配根路徑時返回的值,這個匹配碼可以爲一個大於零的數表示匹配根路徑或傳入-1,即常量UriMatcher.NO_MATCH表示不匹配根路徑。 addURI()方法是用來增加其他URI匹配路徑的,第一個參數傳入標識ContentProvider的AUTHORITY字符串。第二個參數傳入需要匹配的路徑,這裏的#號爲通配符,代表匹配任意數字,另外還可以用*來匹配任意文本。第三個參數必須傳入一個大於零的匹配碼,用於match()方法對相匹配的URI返回相對應的匹配碼。 例如:sMatcher.addURI(“com.test.provider.personprovider”, “person”, 1);如果match()方法匹配content://com.test.provider.personprovider/person路徑,返回匹配碼爲1。
3、實現query,insert,update,delete,getType和onCreate方法。
4、在AndroidManifest.xml當中進行聲明。