Android Contacts Contract:是否可以获取数据行的唯一ID?

时间:2018-08-26 23:18:13

标签: android android-contacts contactscontract

所以我现在知道联系人已保存在三个表中:

  • 联系人表。
  • 原始联系人表。
  • 数据表。

我正在使用的表格:

answer中,我根据@marmor使用数据表读取用户的所有电话号码。

我从上面链接中的解决方案中学到了什么

使用@marmor在上述链接中提供的答案,我可以查询(对于电话簿中的所有联系人)此特定联系人映射到contact_id的{​​{1}}。

定义contact_id和电话号码集:

  • set of phone numbers:是电话簿中可以包含多种类型的关联帐户的联系人的ID。

  • contact_id:是一个包含特定contact_id的所有电话号码的集合。

问题:

假设我有两个用户X和Y:

用户x的contact_id = 0。

用户y的contact_id = 1。

现在,假设用户x链接了以下数字:+ 1111-xxx和+ 2222-xxx

假设用户y链接了以下数字:+ 3333-xxx和+ 2222-xxx

现在,我决定将所有这些号码保存到手机上的本地数据库中:

情况1:

如果我使用这些用户的编号作为要保存到数据库的主要ID,则用户x中的+ 2222-xxx将覆盖用户y中的+ 2222-xxx。

情况2:

如果我使用contact_id作为主要ID保存到数据库中,则对应于同一user_id(0)的+ 1111-xxx和+ 2222-xxx都将被覆盖,因此一个将获胜。

情况3:

如果使用电话号码+ contact_id的组合作为主要ID来保存到数据库中,则可能可行,这似乎不是很干净的解决方案,而且不稳定。

问题:

是否有可能获得一个唯一的id来标识contact_id中找到的每个号码?

谢谢。

1 个答案:

答案 0 :(得分:1)

A。绝对有可能获得数据行ID:

在查询Data.CONTENT_URI时,只需将Data._ID添加到您的投影中,然后就可以获取特定的Data ID并对其进行任何操作。

B。将数据ID保留为联系/数字组合键在您的数据库中是否明智?否。

数据ID会随着时间而变化,并且不能保证保持一致,因此不建议将其持久保存到本地数据库中,并将其用作长期运行的标识符。

C。您可以做什么呢?

使用E164电话号码作为密钥,因为这是无法更改的静态信息,联系人可能会获取或丢失带有其联系信息的电话号码,但是该电话号码仍然是相同的电话号码。

只需在您的钥匙-电话号码-与联系人之间建立一对多连接。 因此,单个电话号码X可以指向0个或多个当前在其数据行中具有该号码的联系人。

您需要定期运行(例如每天一次)以使用设备通讯录中的更改刷新内部数据库。