【问题标题】:ContactsContract.Contacts query for specific accountContactsContract.Contacts 查询特定账户
【发布时间】:2016-12-20 20:53:08
【问题描述】:

是否有有效的查询来查找特定帐户名称和类型的所有聚合联系人?

ContactsContract.Contacts 表具有IN_VISIBLE_GROUP 列,该列对联系人组成员身份有效。因此,如果用户为帐户选择了各种组成员身份,则会设置此列。

似乎没有任何等效的不可见帐户列。但是,Android 联系人应用程序允许选择要查看的特定帐户,而无需点击“自定义”并选择组。这样做会更新ContactsContract.Settings 表。效果似乎没有到达Contacts 表。

我希望能够进行一次查询并返回一个光标,该光标具有一组完全正确的聚合(即来自联系人表)联系人。这可能吗?

【问题讨论】:

  • Android 通讯录应用似乎不正确地使用了设置表。一旦您选择“自定义”,它似乎永远不会再次更新 Settings.IN_VISIBLE_GROUP,从而使该表无法用于此目的。我在几台设备上都观察到了这一点。

标签: android contactscontract


【解决方案1】:

查找特定帐户名称和类型的所有聚合联系人

Contacts 是特定于帐户的,它们由多个RawContacts 组合而成,每个Account 可以保存在不同的Account 上。

您可以查询所有RawContacts 以获得特定的Account

Cursor c = cr.query(RawContacts.CONTENT_URI, 
   new String[]{ RawContacts._ID, RawContacts.CONTACT_ID, RawContacts._ID, ... },
   RawContacts.ACCOUNT_NAME + " = '" + accountName + "' AND " + RawContacts.ACCOUNT_TYPE + " = '" + accountType + "'", null, null);

如果您想要Contacts,您可以将在上述查询中找到的所有联系人ID 放在一个数组中,然后在Contacts 表上进行查询:

Cursor c = cr.query(Contacts.CONTENT_URI, 
   new String[]{ Contacts._ID, Contacts.DISPLAY_NAME, ... },
   Contacts._ID + " IN (" + arrayOfIds + ")", null, null);

【讨论】:

  • 我给了你+1,因为理论上,我认为你的答案有效。我考虑过这个但没有尝试,因为我担心“arrayOfIds”的巨大潜在大小。你认为这对于查询限制和速度效率来说都不是问题吗?
  • 我的应用程序中有类似的东西,在极少数情况下,MySQL 查询大小限制可能会出现问题,但这可以通过大批量执行第二个查询来解决,速度我没有问题
  • 听起来很合理。我会将此标记为正确答案,因为我怀疑谷歌提供了任何更好的选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多