一、概述
ContentProvider是Android四大组件之一,上文以述如果创建一个内容提供者给其他应用去访问,此文将讲述用内容解析者去访问系统的通讯录内容提供者,进行查询与增加。
二、通讯录数据库分析
在通讯录这个应用里有个特别重要的三个表,分别为:raw_contacts、data、mimetype。
1、raw_contacts表保存联系人的ID 例如:contact_id = 0;
2、data表保存联系人的数据,字段data1存放数据,mimetype_id 存放数据类型,raw_contacts_id字段表示保存数据属于那个人联系人的
3、mimetype表保存数据类型 ,字段mimetype_id = 1 代表email,mimetype_id = 5 代表phone, mimetype_id = 7 代表name
三、编码思路
1、读取联系人数据
1:获取应用ContentResolver对象
2:构建访问路径
3:查询遍历Cursor
public void getContact() {
ContentResolver contentResolver = getContext().getContentResolver();
// 获取raw_contacts表中的contact_id的所有值
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
// 获取data表中每一个contact_id对应的data1的值与mimetype的值
Uri uriData = Uri.parse("content://com.android.contacts/data");
Cursor cursor = contentResolver.query(uri, null, null, null, null);
while (cursor.moveToNext()) {
String id = cursor.getString(cursor.getColumnIndex("contact_id"));
if (id != null) {
Cursor cursor1 = contentResolver.query(uriData, null,
"raw_contact_id = ?", new String[] {id}, null);
while (cursor1.moveToNext()) {
String str = cursor1.getString(cursor1
.getColumnIndex("data1"));
String mimetype = cursor1.getString(cursor1
.getColumnIndex("mimetype"));
Map<String, String> map = new HashMap<>();
map.put(mimetype, str);
Log.i("ContackTest", map.toString());
}
cursor1.close();
}
}
cursor.close();
}
2、向通讯录写入数据
1:获取raw_contacts表中 _id最后一个的值
2:向raw_contacts表中最后插入一行,contact_id = _id + 1;
3:向data表中插入对应的值和mimetype类型,raw_contact_id = contact_id;
public void insertContacts()
{
ContentResolver resolver = getContext().getContentResolver();
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
Uri uri1 = Uri.parse("content://com.android.contacts/data");
//获取最后一条的_id的值
Cursor cursor = resolver.query(uri, new String[]{"_id"}, null, null, null);
cursor.moveToLast();
int id = cursor.getInt(cursor.getColumnIndex("_id"));
cursor.close();
ContentValues values = new ContentValues();
int newId = id + 1;
values.put("contact_id", newId);
//在最后面插入一条
resolver.insert(uri, values).toString();
ContentValues value = new ContentValues();
//向data表里插入一条newId的名字的数据
value.put("data1", "杨威");
value.put("mimetype", "vnd.android.cursor.item/name");
value.put("raw_contact_id", newId);
resolver.insert(uri1, value);
//向data表里插入一条newId的电话的数据
value.put("data1", "17770989700");
value.put("mimetype", "vnd.android.cursor.item/phone_v2");
value.put("raw_contact_id", newId);
resolver.insert(uri1, value);
//向data表里插入一条newId的地址的数据
value.put("data1", "娄底");
value.put("mimetype", "vnd.android.cursor.item/sip_address");
value.put("raw_contact_id", newId);
resolver.insert(uri1, value);
}
注意事项:系统通讯录的访问授权是:com.android.contacts
表名有:data、raw_contacts
路径为:content://com.android.contacts/raw_contacts