当系统里包含里多个应用时,有时候就需要在应用之间共享数据,因此安卓就提供了ContentProvider.
当一个应用程序需要把自己的数据暴露给其他应用程序时,该应用程序就可以通过提供ContentProvider来实现,其他应用程序就可通过ContentResolver来操作ContentProvider暴露的数据
ContentProvider是安卓的四大组件之一,也需要在AndroidManifest.xml文件中注册。
一旦某个应用程序暴露了自己的数据操作接口,那么不管该应用程序是否启动,其他应用程序都可通过该接口来操作该应用程序的内部数据,包括增加数据,删除,修改,查询数据
Android系统中自带的电话簿,短信,媒体库等都提供了类似的接口。这就使得第三方应用程序可以充分地利用这部分数据来实现更好的功能。
ContentResolver的基本用法
对于每一个应用程序来说,如果想要访问内容提供器中共享的数据,就一定要借助于ContentResolver类。可以通过context 中的getContextResolver()方法获取到该类的实例,其中的insert()方法,query()方法,update()方法,delete()方法,ContentResolver和SQLiteDatabase不同的是,不用接收表名,而是使用一个uri参数代替。这个参数被称为内容URI。内容URI给内容提供器中的数据建立了唯一标识符。它主要由两个部分组成:权限(authority)和路径(path).权限是用于对不同的应用程序做区分,一般为了避免冲突。都会采用程序包名的方式来进行命名比如某个程序包名是com.example.app那么该程序对应的权限就可以命名为com.example.app.provider。路径则是用于对同一应用程序中的不同的表做区分的,通常都会添加到权限的后面。比如某个程序的数据库里存在两张表。table1,table2.然后把权限和路径进行组合,内容URI就变成了com.example.app.provider/table1和table2。不过目前还很难辨认出这两个字符串就是两个内容URI,我们还需要在字符串的头部加上协议声明。因此内容URI最标准的最标准的格式就是:
content://com.example.app.provider/table1
content://com.example.app.provider/table2
有没有发现,内容URI可以非常清楚的表达出我们想要访问那个程序中那张表里的数据,也正因如此,ContentResolver中的增删改查方法,才都接受URI对象作为参数,因为表名的话系统无法得知我们期望的是那个应用程序里的表。
在得到URI字符串之后,我们还需要将他解析成Uri对象作为参数传入。解析方法如下所示:
Uri uri= Uri.parse(content://com.example.app.provider/table1);
只需要调用Uri.parse();方法,就可以将内容URI字符串解析成Uri对象。
现在我们就可以使用这个Uri对象来查询table1表中的数据了,代码如下所示:
Cursor cursor=getContentResolver().query(
uri, //对应SQL部分(from table_name)描述:指定查询某个应用程序下的 某 一张表
projection,//对应SQL部分(select column1,column2)描述:指定查询的列名
selection,//对应SQL部分(where column =value)描述:指定where的约束条件。
selectionArgs,//描述:为 where中的占位符提供具体的值
sortOrder//对应SQL部分(order by column1,column2)描述:指定查询结果的排序方式。
);
查询完成后,返回的仍然是一个Cursor对象,这时我们就可以将数据从Cursor对象中取出来,读取的思路仍然是通过移动游标的位置来遍历Cursor的所有行。
接下来看看如何向table1中添加一条数据,代码如下所示:
ContentValues values=new ContentValues();
values.put(“colum1”,”text”);
values.put(“colum2”,”1”);
getContentResolver().insert(uri,values);
更新一条数据:
现在如果我们想要更新这条新添加的数据,把colum1的值清空,可以借助ContentResolver的update()方法实现,代码如下所示:
ContentValues values=new ContentValues();
values.put(“colum1”,” “);
getContentResolver().update(uri,values,”colum1=? and column2=?”,new String[]{“text”,” “});
注意上述代码使用了, selection 和selectionArgs参数来对想要更新的数据进行约束,以防止所有的行都会受影响。
删除:
getContentResolver().delete(uri,values,” column2=?”,new String[]{” 1 “});