Android下操作联系人(Contacts)

  * 1.读联系人
联系人数据是存储在com.android.providers.contacts应用的数据库中的, 该应用对外提供了ContentProvider
下载原码可以得到Uri和path
查询raw_contacts表得到手机中联系人的id, 用id作为条件查询data表即可得到联系人的数据
    2.写联系人
先向raw_contacts表写一个id
再用这个id向data表写联系人数据
 ** 3.批量操作

ContentResolver.applyBatch()

操作联系人时注意配置读取联系人和写入联系人的权限!!


关于联系人的数据库的表:


示例代码:

package com.itheima.contact;

import java.util.ArrayList;

import android.content.ContentProviderOperation;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.test.AndroidTestCase;

public class ContactTest extends AndroidTestCase {
	
	private Uri rawContactsUri = Uri.parse("content://com.android.contacts/raw_contacts");
	private Uri dataUri = Uri.parse("content://com.android.contacts/data");

	public void testRead() {
		ContentResolver resolver = getContext().getContentResolver();
		
		// 先查raw_contacts表, 得到所有id(contact_id非null)
		Cursor rawContactsCursor = resolver.query(rawContactsUri, new String[] { "_id" }, null, null, null);
		while (rawContactsCursor.moveToNext()) {
			long id = rawContactsCursor.getLong(0);
			
			// 用id作为条件, 查询data表中的数据,注意没有mimetype_id这一列,该列自动关联到了mimetype时表的mimetype!!!
			Cursor dataCursor = resolver.query(dataUri, new String[] { "mimetype", "data1" }, "raw_contact_id=?", new String[] { id + "" }, null);
			while (dataCursor.moveToNext()) {
				String mimetype = dataCursor.getString(0);
				String data = dataCursor.getString(1);
				System.out.println(mimetype + ": " + data);
			}
		}
	}
	
	/*
	for (String name : dataCursor.getColumnNames()) {	// 获取所有列名
		System.out.println(name);
	}
	 */
	
	public void testWrite() {
		ContentResolver resolver = getContext().getContentResolver();
		ContentValues values = new ContentValues();
		
		// 先向raw_contacts表写一个id
		Uri resultUri = resolver.insert(rawContactsUri, values);
		long id = ContentUris.parseId(resultUri);
		
		// 用这个id作为data表的raw_contact_id, 再写3条数据
		values.put("raw_contact_id", id);
		values.put("mimetype", "vnd.android.cursor.item/name");
		values.put("data1", "曹睿");
		resolver.insert(dataUri, values);
		
		values.put("mimetype", "vnd.android.cursor.item/phone_v2");
		values.put("data1", "13012345678");
		resolver.insert(dataUri, values);
		
		values.put("mimetype", "vnd.android.cursor.item/email_v2");
		values.put("data1", "sl@hotmail.com");
		resolver.insert(dataUri, values);
	}
	//批量操作,类似开启事务,
	public void testWriteBatch() throws Exception {
		ContentResolver resolver = getContext().getContentResolver();
		ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();		// 创建集合, 用来装多个操作
		
		ContentProviderOperation operation1 = ContentProviderOperation.newInsert(rawContactsUri)		// 创建一个Insert操作的Builder
				.withValue("_id", null)		// 设置要插入列名和数据(列名为_id, 数据为null时自动生成)
				.build();					// 生成插入操作对象
		ContentProviderOperation operation2 = ContentProviderOperation.newInsert(dataUri)
				.withValueBackReference("raw_contact_id", 0)				// 插入的数据是同组第1个操作的结果
				.withValue("mimetype", "vnd.android.cursor.item/name")
				.withValue("data1", "张泽华")
				.build();
		ContentProviderOperation operation3 = ContentProviderOperation.newInsert(dataUri)
				.withValueBackReference("raw_contact_id", 0)
				.withValue("mimetype", "vnd.android.cursor.item/phone_v2")
				.withValue("data1", "13187654321")
				.build();
		ContentProviderOperation operation4 = ContentProviderOperation.newInsert(dataUri)
				.withValueBackReference("raw_contact_id", 0)
				.withValue("mimetype", "vnd.android.cursor.item/email_v2")
				.withValue("data1", "zzh@163.com")
				.build();
		
		operations.add(operation1);
		operations.add(operation2);
		operations.add(operation3);
		operations.add(operation4);
		
		resolver.applyBatch("com.android.contacts", operations);	// 一次性执行集合中的多个操作,要成功,则全部成功,若中途某个操作失败,则全失败;
	}
	
	
	
	
	
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值