操作系统的ContentProvider 读写联系人

1.获取联系人

      调用系统提供的contentProvider
      raw_contacts 表
      contact_id 存放联系人的id
      data 表
      这个表是用来存储所有的联系人的详细信息的
     一个联系人的信息可能分为多条数据
      其中比较重要的地段是数据类型,联系人id,还有数据内容。
      其中有一个字段mime_type是数据的类型(电话,邮箱,名字

       等等)
       
      mimetypes 表
      就是联系人所有的数据类型选项

      
      看源码可以看出contentProvider有两个Uri,两个都是可以用  

      的,但是在4.0之后。只能使用分号后面的Uri
      该路径是向低版本兼容的
      如果要获取联系人的数据,该怎么做?
      1.获取所有的联系人的id
      2.根据id查询到这个联系人的所有的数据消息

       

     读取联系人的权限

        />

//在这里进行联系人的获取
    ContentResolver cr = getContentResolver();
    //1.获取所有人的联系人的id
    Cursor cursorID = cr.query(Uri.parse("content://com.android.contacts/raw_contacts"),
            new String[]{"contact_id"}, null, null, null);
    if (cursorID.getCount() == 0) {
        Toast.makeText(MainActivity.this, "没有联系人", Toast.LENGTH_SHORT).show();
        return;
    }
    //2.根据ID获取到每一个联系人的所有信息
    while (cursorID.moveToNext()) {
        //拿到id的字符串
        String contactid = cursorID.getString(cursorID.getColumnIndex("contact_id"));
        //根据ID去data数据库里查询联系人的所有信息
        Cursor contactData = cr.query(Uri.parse("content://com.android.contacts/data"),
                new String[]{"data1", "mimetype"},
                "raw_contact_id=?", new String[]{contactid}, null);
        //遍历获取联系人的信息
        while (contactData.moveToNext()) {
            //拿到数据内容
            String data1 = contactData.getString(contactData.getColumnIndex("data1"));
            //拿到数据类型
            String mimeType = contactData.getString(contactData.getColumnIndex("mimetype"));
            if ("vnd.android.cursor.item/email_v2".equals(mimeType)) {
                Log.i("邮箱", data1);

            } else if ("vnd.android.cursor.item/phone_v2".equals(mimeType)) {
                Log.i("手机;", data1);
            } else if ("vnd.android.cursor,item/name".equals(mimeType)) {
                Log.i("名字", data1);
            }
        }
        //关闭游标对象,释放内存
        contactData.close();

    }
    //关闭游标对象,释放内存
    cursorID.close();
    //3.添加权限,允许读取ContentProvider
    // 
}


2.向系统插入联系人

   1、先去 raw_contacts 表中添加 id;
   2、然后借助 id 去 data 表中添加各种信息。

   写入联系人的权限

      /> 

ContentResolver cr = getContentResolver();
//先查询 raw_contacts 表,获取最新联系人的主键,然后主键+1,就是要插入的联系人的 id
Cursor cursorId = cr.query(Uri.parse("content://com.android.contacts/raw_contacts"),
        new String[]{"_id"},null,null,null);
//默认联系人 id 就是 1
int contact_id = 1;
if(cursorId.moveToLast()){
    //拿到主键
    int _id = cursorId.getInt(cursorId.getColumnIndex("_id")); //主键+1,就是要插入的联系人
    contact_id = ++_id;
}
//把 contact_id 添加到 raw_contacts 表中
ContentValues values = new ContentValues();
values.put("contact_id",contact_id);
cr.insert(Uri.parse("content://com.android.contacts/raw_contacts"),values);
//清空 ContentValues 插入姓名
values.clear();
values.put("data1", "盗跖");
values.put("mimetype", "vnd.android.cursor.item/name");
values.put("raw_contact_id", contact_id);
cr.insert(Uri.parse("content://com.android.contacts/data"), values);
//清空 ContentValues 插入电话
values.clear();
values.put("data1", "888888888");
values.put("mimetype", "vnd.android.cursor.item/phone_v2");
values.put("raw_contact_id", contact_id); cr.insert(Uri.parse("content://com.android.contacts/data"), values);
cursorId.close();
Toast.makeText(MainActivity.this,"插入数据成功",Toast.LENGTH_SHORT).show();



















你可能感兴趣的:(操作系统的ContentProvider 读写联系人)