简介
- 内容提供器主要用于在不同的应用程序之间实现数据的共享功能,它提供了一套完整的机制,允许B程序访问A程序,同时还能报这个被访问数据的安全性。目前,使用内容提供器是使用跨程序之间共享数据的标准方式。
- 内容提供器的用法有两种,一种是使用现有的内容提供器来读取和操作相应程序中的数据,
- 另一种是创建自己的内容提供器,给我们程序的数据提供外部访问接口。
访问其他程序中的数据
4.对于每一个应用程序,如果要访问内容提供器中共享的数据,就一定要借助
5.ContextResolver类,调用getContextResolver()获取该类的实例,然后调用
6.它的CURD来 处理数据。这一点和SQLite相似,只是方法的参数不同,
7.ContextResolver是不接收表名的,而是用一个Uri来代替
8.这个参数被称为内容UIR,它给内容提供器中的数据建立了唯一的标识符,
- 它由两部分组成,权限(authority)和路径(path),权限是为了不同的应用程序
- 做区分,一般避免冲突,都会采用程序包名的方式来进行命名,路径则是用于
对同一个应用程序下不同的表做区分,通常会加载权限的后面,
列如 有两个表格是要对外提供的数据,table1 、table2
- 把权限和路径相结合得到内容URI,再加上协议声明:标准的内容URI字符串
- 如下 :
content://com.example.app.provider/table1
content://com.example.app.provider/table2
- 可以发现内容URI可以很清楚的表达出我们我访问哪个程序中,
- 哪张表中的数据。得到了内容URI字符串之后,要将它解析成
- URI对象,调用Uri.parse();
Uri uri = Uri.parse("content://com.example.app.provider/table1");
- 然后就可以调用getContextResolver()的查询方法来查询表中
- 的数据了。
- 如下:
Cursor cursor = getContextResolver().query(
uri,projection,selection,selectionArgs,sortOrder);
/*
query()参数
uri,指定查询某个应用程序下的某一张表
projection 指定查询的列名
selectionArgs 为where的占位符提供具体的值
sortOrder 排序方式
*/
- 得到游标cursor之后,就可以从中逐个取出了,遍历游标
if(cursor != null){
while(cursor.moveToNext()){
String column1 = cursor.getString(cursor.getColumnIndex("column1"));
}
cursor.close;
}
添加数据
ContentValues values = new ContentValues();
values.put("column1","text");
values.put("column2",2);
getContextResolver().insert(uri,values);
删除数据
getContentResolver().delete(uri,where,selectionsArgs);
//参数和更新数据的类型一致
更新数据
- 更新指定的行 列名为 column1 内容为text 且 column1 内容为1 的行。
ContentValues values = new ContentValues();
values.put("column1","");
getContextResolver().update(uri,values,"column1 = ? and column2 = ?",new String[]{"text",1});
## 读取系统信息 联系人 数据 姓名,电话 未排序` ##
private void readContacts(){
Cursor cursor = null;
try{
cursor =
getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);
if(cursor != null){
while (cursor.moveToNext()){
//获取手机联系人
String displayName =
cursor.getColumnName(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
//获取联系人手机号
String number =
cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
}
}
}catch (Exception e){
e.printStackTrace();
}finally {
cursor.close();
}
}
- 这里query()方法中并没有调用Uri来进行解析,这是因为
- ContactsContract.CommonDataKinds.Phone类已经为我们做
- 好了封装。
- 最后要在AndroidMainfest中添加权限
<uses-permission android:name="android.permission.READ_CONTACTS"/>