关于ContactsContract星标及常用联系人查询返回数据完整性的问询
我来帮你拆解这两个关于Android ContactsContract的问题:
问题1:调用ContactsContract查询星标联系人时,是否会返回“完整”的联系人数据?
这得分情况看:
- 如果你是通过
ContactsContract.Contacts.CONTENT_URI加上筛选条件(比如ContactsContract.Contacts.STARRED = 1)来查询星标联系人,这种方式返回的是联系人基础表的全部列——也就是和你直接查CONTENT_URI拿到的基础列是一致的,比如联系人ID、显示名称、星标状态、头像URI这些。 - 但要注意:联系人的详细数据(比如电话号码、邮箱、地址这类)并不存在于Contacts主表,而是存在
ContactsContract.Data关联表中。所以如果只查Contacts表,你只能拿到基础身份信息,要获取“完整”的关联数据,还得额外关联Data表去查询对应的字段。
问题2:使用
CONTENT_STREQUENT_URI能否获取CONTENT_URI的所有列? 答案是不能。
虽然官方文档说它是Contacts表和Data表关联后的URI,仅筛选星标和最常用联系人,但这里的“有用数据”其实是指高频使用的核心字段,并不是Contacts主表的全部列。
实际测试下来,CONTENT_STREQUENT_URI返回的列是经过精简的,比如包含联系人ID、显示名、星标状态、最后联系时间、使用频率这些常用字段,但像联系人的自定义铃声设置、是否发送到语音信箱这类冷门字段,是不会出现在查询结果里的。
如果你需要某个常用/星标联系人的完整数据,推荐两种方式:
- 先用
CONTENT_STREQUENT_URI拿到联系人ID,再通过ContactsContract.Contacts.CONTENT_URI加上ID筛选条件,去查询该联系人的完整基础信息; - 直接关联
ContactsContract.Data表,根据联系人ID获取你需要的详细数据(比如电话、邮箱等)。
你也可以自己做个小验证:分别用两个URI执行查询,然后调用cursor.getColumnNames()打印所有列名,对比后就能直观看到两者的差异。
内容的提问来源于stack exchange,提问作者Gaket
相关产品推荐
相关产品推荐

