一、学习目标
1.内容提供者(contentProvider)
2.内容解析者(contentResover)
3.内容观察者(contentObserver)
二、contentProvider
1.为什么需要内容提供者
如果B应用需要用到A应用中的(私有)数据库中的数据,由于跨应用,同时A应用数据库的访问权限的原因,导致无法实现,为了解决这个问题,Google工程师就提出了内容提供者(contentProvider),即,A应用需要使用contentProvider来把自己的数据呈现给B应用(其他应用)。
2.内容提供者的原理
其中内容提供者就作为中间人将应用1的数据呈现给应用2。
3.实现内容提供者的具体步骤
①定义内容提供者 定义一个类继承contentProvider,需要重写方法,其中重要的有四个(增删改查)方法和oncreate()方法
public class Myprovider extends ContentProvider {
//当内容提供者初始化 会执行该方法
@Override
public boolean onCreate() {
// TODO Auto-generated method stub
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub
return null;
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}
}
②在清单文件里面配置一下 (由于是四大组件,都需要配置)
<provider android:name="com.gao.db.AccountProvider"
android:authorities="com.gao.provider"
</provider>
③定义一个urimatcher (需要解析uri地址),写一个静态代码块,添加匹配规则,来设置外部应用访问的uri地址(类似于浏览器访问网站,eg:访问百度,http://www.baidu.com)
static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
sUriMatcher.addURI("com.gao.provider", "query", QUERYSUCCESS);//即外部访问的uri为:content://com.gao.provider/qurey 下同
sUriMatcher.addURI("com.gao.provider", "insert", INSERTSUCCESS);
sUriMatcher.addURI("com.gao.provider", "update", UPDATESUCCESS);
sUriMatcher.addURI("com.gao.provider", "delete", DELETESUCCESS);
}
④按照我们添加的匹配规则 暴露想暴露的方法(即: 可以为外部应用提供对数据的增删改查等方法。)
☆☆☆:最后只要是通过内容提供者暴露出来的数据 其他应用访问的方式都是一样的,就是通过内容解析者
三、contentResolver
同样B应用为了得到A应用(已经使用了内容提供者暴露)的数据,就需要内容解析者来解析A应用暴露出来的数据。
实现步骤:
通过 getContentResolver()的到内容解析者,然后按自己的需求(增删改查)来实现对应的方法。
eg:Uri uri = Uri.parse("content://com.gao.provider/query");//前面内容提供者定义的uri
Cursor cursor = getContentResolver().query(uri,new String[] { "name", "money" }, null, null, null);//按找自己需求填写参数
四、内容观察者
应用A和应用B为了知道数据是否发生了改变,于是就用到了内容观察者(contentObserver)。内容观察不是四大组件,不需要在清单文件里配置。
实现步骤:
①在内容提供者中,如果数据改变了,就发送消息,来通知大家数据库被改动了。
getContext().getContentResolver().notifyChange(uri, null);//uri 是通过那个uri来访问修改,就填那个uri
②在其他应用中注册内容观察者
//第二个参数:false时:表示观察的uri 必须是一个确切的uri 。true时,反之
getContentResolver().registerContentObserver(uri, true, new MyContentObserver(new Handler()));
③定义内容观察者
private class MyContentObserver extends ContentObserver{
public MyContentObserver(Handler handler) {
super(handler);
// TODO Auto-generated constructor stub
}
//当我们的观察的Uri发生改变的时候调用
@Override
public void onChange(boolean selfChange) {
// TODO Auto-generated method stub
System.out.println("haha 数据库备操作了");
super.onChange(selfChange);
}
}
五、总结
把这三者联系起来,是非常好理解的。了解三者的功能,再查看api来学习各类中的方法、变量等。
由于内容提供者是某应用为了共享数据,提供数据的目的,因此使用的场所就比较少,于是,它主要运用在需要一些访问系统应用的数据的应用中,例如:备份联系人、备份短信。
内容观察者的应用场所也不多,主要用于监听系统数据(你懂)。