今天是2022年元旦,普天同庆的日子当然要记一篇CSDN庆祝下拉,又不是永远可以这么无忧无虑!
闲言少叙,直奔主题!
ContentProvider主要用于在不同的程序之间实现数据共享的功能,这是android提供了一套完整的机制,允许一个程序访问另外一个程序中的数据,同时还保证被访数据安全性。
ContentProvider用法一般有两种,一种是使用现有的内容提供器来读取和操作相应程序中的数据,另一种是创建自己的内容提供器给我们的程序提供外部的数据共享接口
1.我们先通过访问android系统自带的电话簿,来学习提供器如何跨程序访问数据!
任何应用,想要访问内容提供器中共享的数据,就要借助ContentResolver类,Context中的getContentResolver()可以获得实例!ContentResolver提供了一系列方法对数据进行CRUD操作,insert方法用于添加数据,update用于更新,delete用于删除,query用于查询!是不是感觉很熟悉,没错,这跟SQliteDatabase里的CRUD方法差不多,不过不同的是这些方法接收的参数不是表名,而是接收一个名为内容Uri的参数,内容Uri给内容提供器中数据建立了唯一标识符,它由两部分组成,1,权限,2,路径
权限:权限是用于对不同程序做区分,一般都采用包名的方式进行命名,譬如包名是com.shurol.app,那权限就可以命名为com.shurol.app.provider。
路径:则是对于同一程序中不同表做区分,譬如程序中有数据表table1,那路径命名为/table1
最后还需要在字符串头部加上协议声明!
所以完整的URI字符为:content://com.shurol.app.provider/table1
得到这个URI字符串后还不能直接作为参数,还需要将其解析为Uri对象,解析方法如下
Uri uri=Uri.parse("content://com.shurol.app.provider/table1");
接下来直接上代码,先直接利用内容提供器获取系统的通讯录。
public List<Preson> getData() {
List<Preson> list = new ArrayList<Preson>();//preson里只存放name,number,两个数据
Cursor cursor = null;
try {
cursor=getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null,
null, null);//ContactsContract.CommonDataKinds.Phone.CONTENT_URI是系统提供的访问通讯录的Uri
while (cursor.moveToNext()) {
String name=cursor.getString(cursor
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String number=cursor.getString(cursor
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
list.add(new Preson(
name,number));
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{
if(cursor!=null)cursor.close();
}
return list;
}
上面这个方法就是获取系统的通讯录,把每个联系人的姓名跟电话读出来放入到准备好的存放Preson集合里!并返回集合!
接着我们创建自己的内容提供器,重新新建一个项目1,默认给新的app里用SQlite新建两张表,table1,table2,这里称项目1的应用叫APP1,我们