获取通讯录所有联系人的注意事项

字数 521阅读 553

上周写代码出现了一个bug,获取通讯录联系人的时候,总是不能够获取到只有名字,没有手机号的联系人。头疼了很久,记录一下。

我们都知道想要获取通讯录的所有联系人,肯定是要从手机的本地数据库拿数据,于是就查了一下存通讯录的表,路径是:/data/data/com.Android.providers.contacts/databases/contact2.db

拿出来之后用SQLiteSpy打开目录结构如下:


主要用到的是长方形框框里面的几个表(椭圆形哪个表一会儿再说)

好了,开始查询,正常的步骤是直接使用ContentResolver提供的query方法就行。

ContentResolvercontentResolver=context.getContentResolver();

CursorcontactInfoCursor=contentResolver.query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);

参数一:联系人uri地址

参数二:想要获取的列数名称

参数三:查询条件

参数四:查询条件补充

解释一下,这个query语句有5个参数,第一个是Android_SDK提供的通讯录联系人的URI,指向的地址是:content://com.android.contacts/contacts这个表,可以打开看一下:


contacts

我在通讯录里面存了三个联系人,有一个是没有手机号的,可以看出来这三个联系人都在这个表里面。

之后就执行cursor指针的一系列操作获取想要的数据就可以,我就不多做赘述了,百度一下有很多。

但是还有一个URI是这样的:


CursorcontactInfoCursor=contentResolver.query(Phone.CONTENT_URI,null,null,null,null);

这个查询语句里面的URI的地址是:content://com.android.contacts/data/phones

导出的数据库中没有phones这个表,猜测可能是用has_number那一列去区别了一下联系人,所以这个URI查询出来的数据都有手机号,也就是如果存了一个联系人没有存手机号的话,用这个URI是查不出来的 

推荐阅读更多精彩内容