操作系统的ContentProvider 读写联系人

来源:互联网 发布:mac app store 没反应 编辑:程序博客网 时间:2024/06/05 07:38

1.获取联系人

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

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

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

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

       

     读取联系人的权限

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

//在这里进行联系人的获取    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    // <uses-permission android:name="android.permission.READ_CONTACTS"/>}


2.向系统插入联系人

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

   写入联系人的权限

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

ContentResolver cr = getContentResolver();//先查询 raw_contacts 表,获取最新联系人的主键,然后主键+1,就是要插入的联系人的 idCursor cursorId = cr.query(Uri.parse("content://com.android.contacts/raw_contacts"),        new String[]{"_id"},null,null,null);//默认联系人 id 就是 1int 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();



















0 0