Android 通讯录 数据库的结构以及获取联系人方式



通讯录的数据库都放在contacts2.db中这个数据库放在/data/data/com.android.providers.contacts/databases/contacts2.db

为了完成获取通讯录的任务,这里先介绍几个数据库

data表:

里面包含所有联系人的信息一些字段如下:

一个raw_contact_id 代表一条联系人的记录,而一个记录可以有多个数据,作为数据的区分,就是用mimetype_id来区分,联系人的每个数据的内容都在data1字段中保存着,下面再给出mimetype_id的字段含义。

mimetypes表内容:

id 1:代表邮件

id 3:代表昵称

id 5:代表手机号码

id 7:代表姓名

id 12:代表组成员关系,其他字段你们可以自己去查看。

在这个地方另外说一下 id:12,先看这条数据:

我说过,数据一般都在data1字段中保存,这条记录的包名组关系的类型为4,这时候我们看看 group表中4代表什么意思:

你会发现4的title写着卡1,这是不是就是代表这些联系人都是SM卡上的数据???当然这个得看不同手机厂商。

接着我们再来看一下contacts表:

我自己上网查询的信息,也自己试验的结果就是  data表中的raw_contact_id与contacts表中的name_raw_contact_id相同,所以要想获取联系人,接下来便有一个思路,获取 contacts表中的name_raw_contact_id,然后到data表中根据id来查询相关记录,再根据mimetype来确定数据类型(或者直接查询data表,不过貌似有点麻烦)。

好了,说了这么多给个示例代码,楼主在多款手机上亲测都可以查询的到号码:

ContentResolver resolver = context.getContentResolver();

		// Uri raw_contacts_uri = ContactsContract.Contacts.CONTENT_URI;
		Uri raw_contacts_uri = Uri.parse("content://com.android.contacts/contacts");

		// Uri data_uri = ContactsContract.Data.CONTENT_URI;
		Uri data_uri = Uri.parse("content://com.android.contacts/data");

		Cursor cursor = resolver.query(raw_contacts_uri, null, null, null, null);
		while (cursor.moveToNext()) {
			String contact_id = cursor.getString(cursor.getColumnIndex("name_raw_contact_id"));

			if (null != contact_id) {
				Cursor data_cursor = resolver.query(data_uri, null, "raw_contact_id=?", new String[] { contact_id },
						null);

				Log.d(TAG, "contact_id : " + contact_id);
				Contact contact = new Contact();
				phone2 = false;
				while (data_cursor.moveToNext()) {
					String data1 = data_cursor.getString(data_cursor.getColumnIndex("data1"));
					String mimetype = data_cursor.getString(data_cursor.getColumnIndex("mimetype"));
					if (!TextUtils.isEmpty(data1)) Log.d(TAG, "data1 : " + data1);
					if (!TextUtils.isEmpty(mimetype)) Log.d(TAG, "mimetype : " + mimetype);
					if (mimetype.equals("vnd.android.cursor.item/name")) {
						contact.name = data1;
					} else if (mimetype.equals("vnd.android.cursor.item/phone_v2")) {
						if (phone2) {                   // 作此判断用来获取一个姓名保存来个手机号码的记录
							contact.phone += "/" + data1;
						} else {
							contact.phone = data1;
							phone2 = true;
						}
					}
				}
				data_cursor.close();
				contacts.add(contact);
			}
		}
		cursor.close();

暂时只了解那么多,可能有些地方理解也有问题,如果有不对的地方希望大虾们多多指导!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值