作为四大组件之一的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();
查询联系人信息
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");
}
}
}