標籤:
一、ContentProvider簡介
當應用繼承ContentProvider類,並重寫該類用於提供資料和儲存資料的方法,就可以向其他應用共用其資料。雖然使用其他方法也可以對外共用資料,但資料訪問方式會因資料存放區的方式而不同,如:採用檔案方式對外共用資料,需要進行檔案操作讀寫資料;採用sharedpreferences共用資料,需要使用sharedpreferences API讀寫資料。而使用ContentProvider共用資料的好處是統一了資料訪問方式。
二、如何?ContentProvider
1、繼承抽象類別ContentProvider實現一系列針對於資料的增刪改查等方法;
測試代碼:
package com.example.contentproviderdemo1;import android.content.ContentProvider;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;public class MyContentProvider extends ContentProvider{ @Override //建立後被觸發 public boolean onCreate() { // TODO Auto-generated method stub return false; } @Override //根據uri查詢出selection指定條件所匹配的記錄,可以指定列,和排序方式 public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // TODO Auto-generated method stub return null; } @Override //返回當前Uri的MIME類型,如果URI對應的資料可能包括多條記錄, //那麼MIME類型字串就是以vnd.android.dir/開頭。 //如果該URI對應的資料只有一條記錄,那麼MIME類型字串就是以vnd.android.cursor.item/開頭。 public String getType(Uri uri) { // TODO Auto-generated method stub return null; } @Override //根據Uri插入values對應的資料 public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub return null; } @Override //根據uri刪除selection指定的條件所匹配的記錄 public int delete(Uri uri, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; } @Override //根據uri修改selection指定條件所匹配的記錄 public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; }}
2、需要在AndroidMainfest.xml中完成對ContentProvider的註冊;
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.contentproviderdemo1.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- name:contentprovider的名字,authorities:全域的包名,不允許有重複 --> <provider android:name="myprovider" android:authorities="com.example.contentproviderdemo1"></provider> </application>
三、Uri類簡介
Uri代表了要操作的資料,Uri主要包含了兩部分資訊:1.需要操作的ContentProvider ,2.對ContentProvider中的什麼資料進行操作. 一個Uri由以下幾部分組成:
1.scheme:ContentProvider(內容提供者)的scheme已經由Android所規定為:content://。
2.主機名稱(或Authority):用於唯一標識這個ContentProvider,外部調用者可以根據這個標識來找到它,必須和設定檔中的android:authorities名稱一致。
3.路徑(path):可以用來表示我們要操作的資料,路徑的構建應根據業務而定,如下:
1)要操作contact表中id為10的記錄,可以構建這樣的路徑:/contact/10
2)要操作contact表中id為10的記錄的name欄位, contact/10/name
3)要操作contact表中的所有記錄,可以構建這樣的路徑:/contact
要操作的資料不一定來自資料庫,也可以是檔案等他儲存方式,如下:
要操作xml檔案中contact節點下的name節點,可以構建這樣的路徑:/contact/name
如果要把一個字串轉換成Uri,可以使用Uri類中的parse()方法,如下:
Uri uri = Uri.parse("content://com.changcheng.provider.contactprovider/contact")
四、UriMatcher、ContentUrist和ContentResolver簡介
因為Uri代表了要操作的資料,所以我們很經常需要解析Uri,並從Uri中擷取資料。Android系統提供了兩個用於操作Uri的工具類,分別為UriMatcher 和ContentUris 。掌握它們的使用,會便於我們的開發工作。
UriMatcher:用於匹配Uri,它的用法如下:
1.首先把你需要匹配Uri路徑全部給註冊上,如下:
//常量UriMatcher.NO_MATCH表示不匹配任何路徑的返回碼(-1)。
UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//如果match()方法匹配content://com.changcheng.sqlite.provider.contactprovider/contact路徑,返回匹配碼為1
uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact”, 1);//添加需要匹配uri,如果匹配就會返回匹配碼
//如果match()方法匹配 content://com.changcheng.sqlite.provider.contactprovider/contact/230路徑,返回匹配碼為2
uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact/#”, 2);//#號為萬用字元
2.註冊完需要匹配的Uri後,就可以使用uriMatcher.match(uri)方法對輸入的Uri進行匹配,如果匹配就返回匹配碼,匹配碼是調用addURI()方法傳入的第三個參數,假設匹配content://com.changcheng.sqlite.provider.contactprovider/contact路徑,返回的匹配碼為1。
ContentUris:用於擷取Uri路徑後面的ID部分,它有兩個比較實用的方法:
• withAppendedId(uri, id)用於為路徑加上ID部分
• parseId(uri)方法用於從路徑中擷取ID部分
ContentResolver:當外部應用需要對ContentProvider中的資料進行添加、刪除、修改和查詢操作時,可以使用ContentResolver 類來完成,要擷取ContentResolver 對象,可以使用Activity提供的getContentResolver()方法。 ContentResolver使用insert、delete、update、query方法,來操作資料。
四、ContentProvider樣本程式
Manifest.xml中的代碼:
Android學習(十二) ContentProvider