转自:
http://blog.youkuaiyun.com/xiazdong/article/details/7713419
虽然很基础,但是很久没有操作系统的数据库难免忘记,今天有幸项目需要重新找了下资料,找到这篇很不错的博客,顺便把我的问题解决了,固总结标识下。
写的真的很棒,感谢各位博主的无私奉献。
URI
对raw_contacts表添加、删除、更新操作:
URI = content://com.android.contacts/raw_contacts;
对data表添加、删除、更新操作:
URI = content://com.android.contacts/data;
根据email对data表查询
URI = content://com.android.contacts/data/emails/filter/*
根据电话号码对data表查询
URI = content://com.android.contacts/data/phone/filter/*
如果要根据ID查询电话,可以
URI = content://com.android.contacts/data;
然后where条件为:raw_contact_id=? and mimetype = ?
MIMETYPE
电话:vnd.android.cursor.item/phone_v2
姓名:vnd.android.cursor.item/name
邮件:vnd.android.cursor.item/email_v2
通信地址:vnd.android.cursor.item/postal-address_v2
组织:vnd.android.cursor.item/organization
照片:vnd.android.cursor.item/photo
Data中的常量
Data._ID: "_id"
Data.DISPLAY_NAME:“display_name”
Data.DATA1:“data1”
Data.DATA2:“data2”
Data.RAW_CONTACT_ID:“raw_contact_id”
Data.MIMETYPE:“mimetype”
对通信录做增删改查
简单的说:对通讯录操作就是对一个普通的ContentProvider操作;
1.Query
(1)根据电话号码查询姓名
-
- public void testReadNameByPhone(){
- String phone = "12345678";
-
- Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/"+phone);
- ContentResolver resolver = this.getContext().getContentResolver();
- Cursor cursor = resolver.query(uri, new String[]{Data.DISPLAY_NAME}, null, null, null);
- if(cursor.moveToFirst()){
- Log.i("Contacts", "name="+cursor.getString(0));
- }
- }
查询所有的联系人
-
-
- public void testReadAll(){
-
- Uri uri = Uri.parse("content://com.android.contacts/contacts"); //访问raw_contacts表
- ContentResolver resolver = this.getContext().getContentResolver();
- Cursor cursor = resolver.query(uri, new String[]{Data._ID}, null, null, null);
- while(cursor.moveToNext()){
- StringBuilder buf = new StringBuilder();
- int id = cursor.getInt(0);
- buf.append("id="+id);
- uri = Uri.parse("content://com.android.contacts/contacts/"+id+"/data"); //如果要获得data表中某个id对应的数据,则URI为content://com.android.contacts/contacts/#/data
- Cursor cursor2 = resolver.query(uri, new String[]{Data.DATA1,Data.MIMETYPE}, null,null, null);
- while(cursor2.moveToNext()){
- String data = cursor2.getString(cursor2.getColumnIndex("data1"));
- if(cursor2.getString(cursor2.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/name")){
- buf.append(",name="+data);
- }
- else if(cursor2.getString(cursor2.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/phone_v2")){
- buf.append(",phone="+data);
- }
- else if(cursor2.getString(cursor2.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/email_v2")){
- buf.append(",email="+data);
- }
- else if(cursor2.getString(cursor2.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/postal-address_v2")){
- buf.append(",address="+data);
- }
- else if(cursor2.getString(cursor2.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/organization")){
- buf.append(",organization="+data);
- }
- }
- String str = buf.toString();
- Log.i("Contacts", str);
- }
- }
Insert
注意:对某个联系人插入姓名、电话等记录时必须要插入Data.MIMETYPE(或者是"mimetype")属性,而不是插入"mimetype_id"!
比如:values.put(Data.MIMETYPE,"vnd.android.cursor.item/phone_v2");
-
- public void testAddContacts(){
-
- Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
- ContentResolver resolver = this.getContext().getContentResolver();
- ContentValues values = new ContentValues();
- long contact_id = ContentUris.parseId(resolver.insert(uri, values));
-
- uri = Uri.parse("content://com.android.contacts/data");
-
- values.put("raw_contact_id", contact_id);
- values.put(Data.MIMETYPE,"vnd.android.cursor.item/name");
- values.put("data2", "zdong");
- values.put("data1", "xzdong");
- resolver.insert(uri, values);
- values.clear();
-
- values.put("raw_contact_id", contact_id);
- values.put(Data.MIMETYPE,"vnd.android.cursor.item/phone_v2");
- values.put("data2", "2");
- values.put("data1", "87654321");
- resolver.insert(uri, values);
- values.clear();
-
- values.put("raw_contact_id", contact_id);
- values.put(Data.MIMETYPE,"vnd.android.cursor.item/email_v2");
- values.put("data2", "2");
- values.put("data1", "xzdong@xzdong.com");
- resolver.insert(uri, values);
- }
批量添加数据
(1)ContentProviderOperation operation = ContentProviderOperation.newInsert(uri).withValue("key","value").build();
(2)resolver.applyBatch("authorities",operations);//批量提交
- public void testAddContactsInTransaction() throws Exception {
- Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
- ContentResolver resolver = this.getContext().getContentResolver();
- ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();
-
-
- ContentProviderOperation operation1 = ContentProviderOperation
- .newInsert(uri).withValue("account_name", null).build();
- operations.add(operation1);
-
- uri = Uri.parse("content://com.android.contacts/data");
-
- ContentProviderOperation operation2 = ContentProviderOperation
- .newInsert(uri).withValueBackReference("raw_contact_id", 0)
-
- .withValue("mimetype", "vnd.android.cursor.item/name")
- .withValue("data2", "xzdong").build();
- operations.add(operation2);
-
- ContentProviderOperation operation3 = ContentProviderOperation
- .newInsert(uri).withValueBackReference("raw_contact_id", 0)
- .withValue("mimetype", "vnd.android.cursor.item/phone_v2")
- .withValue("data2", "2").withValue("data1", "0000000").build();
- operations.add(operation3);
- resolver.applyBatch("com.android.contacts", operations);
- }
Delete
(1)先在raw_contacts表根据姓名(此处的姓名为name记录的data2的数据而不是data1的数据)查出id;
(2)在data表中只要raw_contact_id匹配的都删除;
- public void testDelete()throws Exception{
- String name = "xzdong";
-
- 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);
-
- 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+""});
- }
- }
Update
(1)不需要更新raw_contacts,只需要更新data表;
(2)uri=content://com.android.contacts/data 表示对data表进行操作;
- public void testUpdate()throws Exception{
- int id = 1;
- String phone = "999999";
- Uri uri = Uri.parse("content://com.android.contacts/data");//对data表的所有数据操作
- ContentResolver resolver = this.getContext().getContentResolver();
- ContentValues values = new ContentValues();
- values.put("data1", phone);
- resolver.update(uri, values, "mimetype=? and raw_contact_id=?", new String[]{"vnd.android.cursor.item/phone_v2",id+""})
- }