内容提供者-Content Provider

时间:2021-11-05 12:06:02

作用: 主要用于在不同程序之间实现数据共享的功能

ContentResolver的使用:

借助ContentResolver类便可以实现访问内容提供者*享的数据

创建实例:Context.getContentResolver()

  • insert()://用于添加数据
  • delete()://用于删除数据
  • query()://用于查询数据
  • update()://用于更新数据

Uri对象

它由两部分组成:权限(authority)+路径(path)
标准格式:content://com.sendi.app.provider/table1

得到uri字符串之后,我们还需将它解析成Uri对象:
Uri.parse(“content://com.sendi.app.provider/table1”);

Uri规则:
content://com.sendi.app.provider/table1/1 :表示访问com.sendi.app这个应用下table表中id为1的数据
“*” :匹配任意长度的任意字符
“#”:匹配任意长度的任意数字

增删改查

  • 查询:
    Cursor cursor=getContentResolver().query(
    uri,
    列名,
    条件,
    where中指定占位符的值,
    排序方式);

while(cursor.moveToNext()){
String col1=cursor.getString(cursor.getColumnIndex(“列值1”));
String col2=cursor.getString(cursor.getColumnIndex(“列值2”));
}
cursor.cloase();

  • 添加:
    ContentValues values=new ContentValues();
    values.put(“c1”,”value1”);
    values.put(“c2”,”value2”);
    getContentResolver().insert(uri,values);

  • 更新:
    ContentValues values=new ContentValues();
    values.put(“c1”,”value1”);
    getCOntentResolver().update(uri,values,”c1=? and c2=?”,new String[]{“text”,”1”});

  • 删除:
    getContentResolver().delete(uri,”c2=?”,new String[]{“v2”});

自定义内容提供者

  1. 继承ContentProvider
  2. 实现方法:onCreate、query、insert、update、delete、getType
    • onCreate:内容提供者初始化成功返回true,否则返回false
    • query:查询
    • insert:插入
    • update:更新
    • delete:删除
    • getType:根据传入的Uri返回相应的类型

注意
需要在清单中注册内容提供者

<provider 
android:name="com.sendi.test.MyProvider"
android:authorities="com.sendi.test.provider"
android:exported="true">

</provider>

最后附上获取手机联系人代码

 private List<ContactBook> initContactList(List<ContactBook>contactList){

ContentResolver cr=mActivity.getContentResolver();

Cursor cursorContactId=cr.query(Uri.parse("content://com.android.contacts/raw_contacts"),new String[]{"contact_id"},null,null,null);

while (cursorContactId.moveToNext()){

List<String>list=new ArrayList<>();
String contactId=cursorContactId.getString(0);
Cursor cursorData=cr.query(Uri.parse("content://com.android.contacts/data"),new String[]{"data1","mimetype"},
"raw_contact_id=?",new String[]{contactId},null);

while (cursorData.moveToNext()){
String data=cursorData.getString(0);
list.add(data);
Log.i("TEST", "click: "+data);
}

contactList.add(new ContactBook(list.get(1),list.get(0)));
}
cursorContactId.close();
return contactList;
}

记得在清单文件添加权限

    <uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>