Android开发系列(十一):对手机通讯录的读取、添加、删除、查找
一、通讯录介绍
通讯录是Android手机自带的一个应用,它是一个ContentProvider应用,其它应用可以对通讯录进行访问,进行对联系人的CRUD操作。
二、通讯录数据库结构的介绍
首先,我们可以在File Explorer视图下找到contacts2.db文件,这是通讯录的文件
然后,我们用SQLite打开,分析下它的数据库结构:
raw_contacts表:
data表:
mimetypes表:
这三张表的结构介绍完了,接下来我们说下它们之间的联系:
raw_contacts表存放联系人的记录ID:字段名称是_id
data表存放联系人的信息:_id是主键,raw_contacts_id对应raw_contacts表的_id,mimetype_id字段对应的是mimetypes表的_id
mimetypes表存放data表的每条记录的属性:_id是主键,为1的时候是email类型
三、显示、添加、删除、查找联系人:
1、获取所有的联系人:
public void testContacts() throws Exception{ Uri uri = Uri.parse("content://com.android.contacts/contacts"); //获得一个ContentResolver数据共享的对象 ContentResolver reslover = getContext().getContentResolver(); //取得联系人中开始的游标,通过content://com.android.contacts/contacts这个路径获得 Cursor cursor = reslover.query(uri, null, null, null, null); //上边的所有代码可以由这句话代替:Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); //Uri.parse("content://com.android.contacts/contacts") == ContactsContract.Contacts.CONTENT_URI while(cursor.moveToNext()){ //获得联系人ID String id = cursor.getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts._ID)); //获得联系人姓名 String name = cursor.getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts.DISPLAY_NAME)); //获得联系人手机号码 Cursor phone = reslover.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id, null, null); StringBuilder sb = new StringBuilder("contactid=").append(id).append(name); while(phone.moveToNext()){ //取得电话号码(可能存在多个号码) int phoneFieldColumnIndex = phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); String phoneNumber = phone.getString(phoneFieldColumnIndex); sb.append(phoneNumber+"www"); } //建立一个Log,使得可以在LogCat视图查看结果 Log.i(TAG, sb.toString()); } }
2、查找联系人:
//根据号码获取联系人的姓名 public void testContactNameByNumber() throws Exception{ String number = "110"; Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/"+number); ContentResolver resolver = getContext().getContentResolver(); Cursor cursor = resolver.query(uri, new String[]{android.provider.ContactsContract.Data.DISPLAY_NAME}, null, null, null); if(cursor.moveToFirst()){ String name = cursor.getString(0); Log.i(TAG, name); } cursor.close(); }
3、添加联系人:
//添加联系人 public void testAddContact() throws Exception{ Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); ContentResolver resolver = getContext().getContentResolver(); ContentValues values = new ContentValues(); long contactid = ContentUris.parseId(resolver.insert(uri, values)); uri = Uri.parse("content://com.android.contacts/data"); //添加姓名 values.put("raw_contact_id", contactid); values.put(Data.MIMETYPE, "vnd.android.cursor.item/name"); values.put("data1", "xiaoming"); resolver.insert(uri, values); values.clear(); //添加电话 values.put("raw_contact_id", contactid); values.put(Data.MIMETYPE, "vnd.android.cursor.item/phone_v2"); values.put("data1", "1234120155"); resolver.insert(uri, values); values.clear(); //添加Email values.put("raw_contact_id", contactid); values.put(Data.MIMETYPE, "vnd.android.cursor.item/email_v2"); values.put("data1", "[email protected]"); resolver.insert(uri, values); }
4、批量添加联系人(因为如果按照姓名、电话、Email的方式添加的话,其中一个环节出错,联系人也可以添加上去。但是批量的话就是一下子添加所有的)
//批量添加 public void testAddContact2() throws Exception{ Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); ContentResolver resolver = getContext().getContentResolver(); ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>(); ContentProviderOperation op1 = ContentProviderOperation.newInsert(uri) .withValue("account_name", null) .build(); operations.add(op1); uri = Uri.parse("content://com.android.contacts/data"); //添加姓名 ContentProviderOperation op2 = ContentProviderOperation.newInsert(uri) .withValueBackReference("raw_contact_id", 0) .withValue("mimetype", "vnd.android.cursor.item/name") .withValue("data2", "李小龙") .build(); operations.add(op2); //添加电话号码 ContentProviderOperation op3 = ContentProviderOperation.newInsert(uri) .withValueBackReference("raw_contact_id", 0) .withValue("mimetype", "vnd.android.cursor.item/phone_v2") .withValue("data1", "1234120155") .withValue("data2", "2") .build(); operations.add(op3); resolver.applyBatch("com.android.contacts", operations); }
5、删除联系人:
public void testDelete()throws Exception{ String name = "李小龙"; //根据姓名求id Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); ContentResolver resolver = this.getContext().getContentResolver(); Cursor cursor = resolver.query(uri, new String[]{Data._ID},"display_name=?", new String[]{name}, null); if(cursor.moveToFirst()){ int id = cursor.getInt(0); //根据id删除data中的相应数据 resolver.delete(uri, "display_name=?", new String[]{name}); uri = Uri.parse("content://com.android.contacts/data"); resolver.delete(uri, "raw_contact_id=?", new String[]{id+""}); } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。