您的位置:首页 > 移动开发 > Android开发

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

2015-05-01 13:27 393 查看

通讯录的数据库都放在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();
暂时只了解那么多,可能有些地方理解也有问题,如果有不对的地方希望大虾们多多指导!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐