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);
复制代码