ContentProvider和ContentResolver的使用
contentprovider
contentprovider 在android中的作用是对外共享数据,也就是说你可以通过contentprovider把应用中的数据共享给其他应用访问,其他应用可以通过contentprovider 对你应用中的数据进行添删改查。
contentprovider的就是自定义增删改查接口并暴露出去,让别的应用访问自己的数据。contentresolver就是按照一定规则访问内容提供者的数据。
contentprovider对外共享数据步骤:
步骤
1. 定义一个类 继承 contentprovider
2. 定义匹配规则 uri
3. 通过静态代码块添加匹配规则
4.在manifest.xml中配置contentprovider.
contentprovider类主要方法的作用:
public boolean oncreate() 该方法在其它应用第一次访问它时才会被创建。
public uri insert(uri uri, contentvalues values)
public int delete(uri uri, string selection, string[] selectionargs)
public int update(uri uri, contentvalues values, string selection, string[] selectionargs)
public cursor query(uri uri, string[] projection, string selection, string[] selectionargs, string sortorder)
public string gettype(uri uri)
uri介绍
uri代表了要操作的数据
contentprovider的scheme为:content://
主机名(或叫authority)用于唯一标识这个contentprovider,外部调用者可以根据这个标识来找到它。
路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:
要操作file表中id为10的记录,可以构建这样的路径:/file/10
要操作file表中id为10的记录的name字段, file/10/name
要操作file表中的所有记录,可以构建这样的路径:/file
当然要操作的数据可以是数据库,也可以是文件、xml或网络等其他存储方式。
代码示例
public class fileprovider extends contentprovider { private context mcontext; private static final int queysucess = 0; private static final int insertsucess = 1;
//urimatcher.no_match表示不匹配任何路径的返回码
private static urimatcher murimatcher = new urimatcher(urimatcher.no_match); private sqlitedatabase mdb; private string mtablename = dbopenhelper.student_table_name;
static{
//注册所有要匹配的uri
murimatcher.adduri("com.itcast.contentp.fileprovider", "query", queysucess);
murimatcher.adduri("com.itcast.contentp.fileprovider", "insert", insertsucess);
}
@override
public boolean oncreate() {
mcontext = getcontext();
mdb = new dbopenhelper(mcontext).getwritabledatabase();
return false;
}
@override
public cursor query(uri uri, string[] arg1, string arg2, string[] arg3,string arg4) {
if (murimatcher.match(uri)== queysucess ) {//uri匹配后进行下面的操作
cursor cursor = mdb.query(tablename, arg1, arg2, arg3, null, null, null);
getcontext().getcontentresolver().notifychange(uri, null);
return cursor;
}else{
throw new illegalargumentexception("match fail");
}
}
这里只给出部分代码。。。。。。
contentresolver
使用contentresolver调用contentprovider提供的接口,对contentprovider中的数据进行添加、删除、修改和查询操作时。
可以使用activity提供的getcontentresolver()方法来获取contentresolver对象。 contentresolver 类提供了与contentprovider类相同签名的四个方法:
- public uri insert(uri uri, contentvalues values)
- public int delete(uri uri, string selection, string[] selectionargs)。
- public int update(uri uri, contentvalues values, string selection, string[] selectionargs)
- public cursor query(uri uri, string[] projection, string selection, string[] selectionargs, string sortorder)
1.对contentprovider中的数据进行增删改查
直接看代码:
//uriquery必须与要查询的contentprovider中的要操作数据的uri保持一致(btw 这里只给了查询好插入的例子)
contentvalues values = new contentvalues(); cursor cursor = getcontentresolver().query(uriquery, null, null, null, null); int count = cursor.getcount(); //获取到一共有多少行 int contact_id = count + 1; contentvalues namevalues = new contentvalues(); namevalues.put("name", name); namevalues.put("mime_type", "vnd.android.cursor.item/name"); namevalues.put("contact_id", contact_id); getcontentresolver().insert(uriinsert, namevalues);
2.监听contentprovider中数据的变化
在contentprovider 发生数据变化时调用getcontentresolver().notifychange(uri, null)来通知注册在此uri上的访问者。
当数据放生变化时会调用contentobserver的onchange()来进行一系列的后续操作~~~
如下:
public class mainactivity extends activity { private uri uri; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); //注册 uri = uri.parse("content://com.itcast.contentp.accountprovider");
getcontentresolver().registercontentobserver(uri, true, new myobserver(new handler()))
}
}
//监听到变化后调用onchange()来执行一系列操作
private class myobserver extends contentobserver { uri uri = uri.parse("content://com.itcast.contentp.accountprovider");
public myobserver(handler handler) {
super(handler);
}
@override
public void onchange(boolean selfchange) {
cursor cursor = getcontentresolver().query(uri, new string[]{"file","mime_type","date"}, null, null, null);
while(cursor.movetonext()){
//执行一些操作
}
}
}
上一篇: 六月黄和大闸蟹到底有哪些区别
推荐阅读
-
C# 索引器的理解和使用
-
[日常] 使用TCPDUMP和Ethereal抓包分析HTTP请求中的异常情况
-
DevExpress的GridControl的使用以及怎样添加列和绑定数据源
-
Linux系统中用于复制的cp和scp命令使用解析
-
smarty模板引擎中内建函数if、elseif和else的使用方法
-
Oracle密码文件的使用和维护第1/3页
-
在Linux上安装和使用Rsync进行同步的教程
-
OpenCV中的新函数connectedComponentsWithStats使用(python和c++实例)
-
详谈js使用in和hasOwnProperty获取对象属性的区别
-
浅谈sql语句中GROUP BY 和 HAVING的使用方法