Contacts Provider基础

      作为四大组件之一的ContentProvider工作中我们很少会用到自己自定义的ContentProvider,用到的最多的就是系统提供的。官方文档提供了两种系统ContentProvider,一种是CalendarProvider,一种是Contacts Provider。今天我们的主角就是Contact Provider。

     The Contacts Provider is an Android content provider component. It maintains three types of data about a person

    这句话源于官网,大概意思就是Contacts Provider是安卓内容提供者组件,它维护着关于用户的三种数据类型。

   这三种数据类型指向三种表:ContactsContract.Contacts、ContactsContract.RawContacts、ContactsContract.Data

  

  下面我们就分别看一下三个表的表结构:

   Contacts:由下面的表结构我们可以发现,该表主要维护着_id和raw_contact_id这两个字段。

    RawContacts: containing a summary of a person's data, specific to a user account and type.(包含着用户信息的摘要以及一个用户的账户和类型的详情)

   

  Data:containing the details for raw contact(包含raw contact表的详情)



  通过上面的图文并茂,我们已经初略的了解了三个表的结构以及作用,下面我们就来分别了解一下三个表的应用:

  仔细观察我截取的图片,不难发现一个数字在三个表都有出现,那就是“25”;在Contacts表中,我们可以发现_id和raw_contact_id是一样的,没错,这不是偶然的,如果你多添加几条联系人就会相信这个结果的。那么这个id又有什么用呢?又是如何产生的呢?

  首先我们来看它是如何产生的:

     当我们想增加一条新的联系人的时候,首先我们必须先在RawContacts这个表中插入一条数据,然后系统就会给我们返回一个URi,此Uri里面就包含该ID。代码如下:     

 ContentValues values = new ContentValues();
 Uri rawContactUri = getContentResolver().insert(RawContacts.CONTENT_URI, values);
 long rawContactId = ContentUris.parseId(rawContactUri);

    有了这个ID,我们就可以尽情的插入我们的数据啦:

                                                                             增加联系人

    第一步:插入联系人名称:

      

     contentValues.clear();
     contentValues.put(ContactsContract.CommonDataKinds.StructuredName.RAW_CONTACT_ID, rawContactId);
     contentValues.put(ContactsContract.CommonDataKinds.StructuredName.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
     contentValues.put(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, "王五");
     contentResolver.insert(ContactsContract.Data.CONTENT_URI, contentValues);
    第二步:插入手机号:ContactsContract.CommonDataKinds.Phone

       

  contentValues.clear();
  contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
  contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
  contentValues.put(ContactsContract.CommonDataKinds.Phone.NUMBER, "13688888888");
  contentResolver.insert(ContactsContract.Data.CONTENT_URI, contentValues);
      第三步:插入邮箱地址:ContactsContract.CommonDataKinds.Email

    

  contentValues.clear();
  contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
  contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE);
  contentValues.put(ContactsContract.CommonDataKinds.Email.ADDRESS, "********@hotmail.com");
  contentValues.put(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_HOME);
  contentResolver.insert(ContactsContract.Data.CONTENT_URI, contentValues);
    第四步:插入网址: ContactsContract.CommonDataKinds.Website

     

  contentValues.clear();
  contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
  contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE);
  contentValues.put(ContactsContract.CommonDataKinds.Website.URL, "www.taolv365.com");
  contentValues.put(ContactsContract.CommonDataKinds.Website.TYPE, ContactsContract.CommonDataKinds.Website.TYPE_WORK);
  contentResolver.insert(ContactsContract.Data.CONTENT_URI, contentValues);
    第五步:插入地址 ContactsContract.CommonDataKinds.StructuredPostal
   contentValues.clear();
   contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
   contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE);
   contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, "上步路");
   contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, "008512");
   contentValues.put(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK);
   contentResolver.insert(ContactsContract.Data.CONTENT_URI, contentValues);
   第六步:插入昵称 ContactsContract.CommonDataKinds.Nickname

     

   contentValues.clear();
   contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
   contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE);
   contentValues.put(ContactsContract.CommonDataKinds.Nickname.NAME, "娃哈哈");
   contentValues.put(ContactsContract.CommonDataKinds.Nickname.TYPE, ContactsContract.CommonDataKinds.Nickname.TYPE_SHORT_NAME);
   contentResolver.insert(ContactsContract.Data.CONTENT_URI, contentValues);
      第七步:插入备注 ContactsContract.CommonDataKinds.Note

      

   contentValues.clear();
   contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
   contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE);
   contentValues.put(ContactsContract.CommonDataKinds.Note.NOTE, "备注成功");
   contentResolver.insert(ContactsContract.Data.CONTENT_URI, contentValues);
    第八步:插入即时消息 ContactsContract.CommonDataKinds.Im

     

   contentValues.clear();
   contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
   contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE);
   contentValues.put(ContactsContract.CommonDataKinds.Im.DATA, "即时消息");
   contentValues.put(ContactsContract.CommonDataKinds.Im.TYPE, ContactsContract.CommonDataKinds.Im.TYPE_HOME);
   contentResolver.insert(ContactsContract.Data.CONTENT_URI, contentValues);
     插入的数据都是保存在Data表里面的,所以 URI为:ContactsContract.Data.CONTENT_URI

   

                                                                                         删除联系人

  

   contentResolver.delete(ContactsContract.RawContacts.CONTENT_URI, ContactsContract.RawContacts.CONTACT_ID+"=?",new String[]{"26"});
   contentResolver.delete(ContactsContract.Data.CONTENT_URI, ContactsContract.Data.CONTACT_ID+"=?",new String[]{"26"});
   Toast.makeText(MainActivity.this,"删除成功",Toast.LENGTH_LONG).show();
      注意:删除数据的时候要同时删除RawContacts和Data表里面的数据


                                                                                      修改联系人信息

    

    contentValues=new ContentValues();
    contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, 27);
    contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
    contentValues.put(ContactsContract.CommonDataKinds.Phone.NUMBER, "13699999999");
    contentResolver.insert(ContactsContract.Data.CONTENT_URI, contentValues);
    contentResolver.update(ContactsContract.Data.CONTENT_URI, contentValues, ContactsContract.Data.CONTACT_ID + "=?", new String[]{"27"});
    Toast.makeText(MainActivity.this,"修改成功",Toast.LENGTH_LONG).show();
                                                     

                                                                                      查询联系人信息

       

<span style="color:#333333;">     cursor=contentResolver.query(ContactsContract.Contacts.CONTENT_URI, new String[]{ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME},null,null,null);
     while (cursor.moveToNext()){
           String id=cursor.getString(cursor.getColumnIndex(ContactsContract.Data._ID));
    Cursor cursor_phone=contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,new String[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER}, ContactsContract.Data.RAW_CONTACT_ID+"=?",new String[]{id},null);
                    if (cursor_phone !=null){
                        while (cursor_phone.moveToNext()){
                            String name=cursor_phone.getString(cursor_phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                            String number=cursor_phone.getString(cursor_phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                            textView_show.append("_Name:"+name+"Number:"+number+"\n");
                        }
                    }
                }</span>

             另外,所有表的列名都可以在ContactsContract.DataColumns这个接口的实现类里面找到。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值