ContentProvider 內容提供者爲不一樣的應用之間數據共享,提供統一的接口,咱們知道安卓系統中應用內部的數據是對外隔離的,要想讓其它應用能使用本身的數據(例如通信錄)這個時候就用到了 ContentProvider。android
-CRUD數據庫
-ContentObserverbash
ContentProvider 經過 uri 來標識其它應用要訪問的數據,經過 ContentResolver 的 query,update,insert,delete.(CRUD)方法實現對共享數據的操做。還能夠經過註冊 ContentObserver 來監聽數據是否發生了變化來對應的刷新頁面,接下來咱們就來介紹一下ide
onCreate 在建立 ContentProvider 時使用this
query 用於查詢指定 uri 的數據返回一個 Cursorspa
insert 用於向指定 uri 的 ContentProvider 中添加數據code
delete 用於刪除指定 uri 的數據server
update 用戶更新指定 uri 的數據xml
getType 用於返回指定的 Uri 中的數據 MIME 類型繼承
ContentResolver 經過 uri 來定位本身要訪問的數據,uri 的格式:[scheme:][//host:port][path][?query]
CRUD 實例代碼以下:
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.madreain.provider.myprovider/tablename");
//添加一條記錄
ContentValues values = new ContentValues();
values.put("name", "madreain");
values.put("age", 26);
resolver.insert(uri, values);
//獲取tablename表中全部記錄
Cursor cursor = resolver.query(uri, null, null, null, "tablename data");
while(cursor.moveToNext()){
Log.i("ContentTest", "tablename_id="+ cursor.getInt(0)+ ", name="+ cursor.getString(1));
}
//把id爲1的記錄的name字段值更改新爲zhang1
ContentValues updateValues = new ContentValues();
updateValues.put("name", "zhang1");
Uri updateIdUri = ContentUris.withAppendedId(uri, 2);
resolver.update(updateIdUri, updateValues, null, null);
//刪除id爲2的記錄,即字段age
Uri deleteIdUri = ContentUris.withAppendedId(uri, 2);
resolver.delete(deleteIdUri, null, null);
複製代碼
com.madreain.provider.myprovider 須要在 AndroidManifest.xml 中進行註冊
<provider android:name="MyProvider"
android:authorities="com.madreain.provider.myprovider"
android:enabled="true"
android:exported="true"/>
複製代碼
介紹一下 ContentProvider、ContentResolver、ContentObserver 之間的關係: ContentProvider——內容提供者, 在 android 中的做用是對外共享數據,也就是說你能夠經過 ContentProvider 把應用中的數據共享給其餘應用訪問,其餘應用能夠經過 ContentProvider 對你應用中的數據進行添刪改查。 ContentResolver——內容解析者, 其做用是按照必定規則訪問內容提供者的數據(其實就是調用內容提供者自定義的接口來操做它的數據)。 ContentObserver——內容觀察者,目的是觀察(捕捉)特定 Uri 引發的數據庫的變化,繼而作一些相應的處理,它相似於數據庫技術中的觸發器(Trigger),當 ContentObserver 所觀察的 Uri 發生變化時,便會觸發它。
內容觀察者,觀察特定 Uri 引發的數據庫的變化,繼而作一些相應的處理,當 ContentObserver 所觀察的 Uri 發生變化時,便會觸發它回調 onChange 方法
繼承 ContentObserver,實現 onChange 方法
public class MObserver extends ContentObserver{
public MObserver(Handler handler){
super(handler);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
queryDb();
}
}
複製代碼
在 AActivity 中註冊和註銷
//註冊
MObserver mContentObserver = new MObserver(new Handler(),this);
getContentResolver().registerContentObserver(Madreain.CONTENT_URI_DELETE,true, mContentObserver);
//註銷
getContentResolver().unregisterContentObserver(mContentObserver);
複製代碼