【问题标题】:How to uniquely identify a contact on ContactsContract.Contacts table如何唯一标识 ContactsContract.Contacts 表上的联系人
【发布时间】:2017-07-17 14:20:03
【问题描述】:

我有一个应用程序可以获取设备上联系人的ContactsContract.Contacts.LOOKUP_KEY 并将其保存在应用程序 Db 上。

阅读this 页面后,我想我可以使用LOOKUP_KEY 来唯一标识联系人,即使在编辑联系人时(例如在编辑联系人姓名之后)。

实际上我看到编辑联系人后,它的LOOKUP_KEY 发生了变化,所以我不能再使用我保存在我的应用程序数据库中的LOOKUP_KEY

我的问题是:有没有办法唯一标识ContactsContract.Contacts 上的联系人,从它在设备上第一次创建到从设备中删除为止?

谢谢

【问题讨论】:

  • 能否举个例子?

标签: android android-contacts contactscontract


【解决方案1】:

LOOKUP_KEY 不能单独用作密钥,而应与联系人的_ID 一起使用以形成完整的lookupUri

然后可以使用lookupUriCONTENT_LOOKUP_URI 表中查找联系人。 CONTENT_LOOKUP_URI 基本上首先通过_ID 查找联系人,如果找不到,或者_ID 似乎是错误的联系人,它使用来自LOOKUP_KEY 部分的hints 来尝试为您找到正确的联系人。

来自CONTENT_LOOKUP_URI

此表的 content:// 样式 URI,应用于创建 快捷方式或以其他方式创建联系人的长期链接。这个 URI 后面应该总是跟一个“/”和联系人的 LOOKUP_KEY。它 还可以选择附加一个“/”和最后一个已知的联系人 ID 在那之后。这种“完整”的格式是一个重要的优化,是 强烈推荐。

只要联系人的行 ID 保持不变,此 URI 就是 相当于 CONTENT_URI。如果联系人的行 ID 因此更改 对于同步或聚合,此 URI 将使用 间接信息(同步 ID 或构成原始联系人)。

查找键应附加未编码 - 它存储在编码 表单,准备在 URI 中使用。

来自getLookupUri(long contactId, String lookupKey)

使用给定的 _ID 和 LOOKUP_KEY。

来自LOOKUP_KEY

一个不透明的值,其中包含 提示,说明如何找到联系人,如果它 由于同步或聚合而更改了行 ID。

【讨论】:

  • 所以识别联系人的最佳方式是通过您从getLookupUri 获得的信息?而不是传递给它的“lookupKey”,对,正如问题所说的那样?假设我希望有一个包含有关每个联系人的额外信息的数据库,我应该有“lookupUri”,还是实际上有“lookupKey”和“contactId”(我可以一起从它们中制作“lookupUri”?它是如何做到的?知道什么时候“_ID 似乎是错误的联系人”?
【解决方案2】:

每个名为_ID 的联系人的行ID(主键)。

【讨论】:

  • 不要这样做,每当用户重新导入他们的联系人时,他们都会获得新的 ID
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多