使用ContentResolver访问通讯录ContentProvider

一、概述
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

你可能感兴趣的:(javaSE,通讯录)