阅读Android联系人时我应该依赖SOURCE_ID吗?

时间:2017-02-01 20:04:24

标签: android android-contacts android-syncadapter

我正在创建一个Android联系人应用,所以我经常阅读用户的联系人并将其存储在我的应用中。要做到这一点,我需要依赖某种ID,以便我知道应该在我的应用中更新(或添加/删除)哪个联系人,Contacts Provider提供其中几个:

  • CONTACT_ID是汇总联系人ID,
  • 每个聚合联系人都包含一个或多个原始联系人,每个联系人都有自己的RAW_CONTACT_ID
  • 并且最重要的是,每个Raw Contact都有SOURCE_ID,它应该是服务器ID,即此联系人在此帐户的服务器中拥有的ID。

我选择依靠SOURCE_ID,因为这听起来像是最稳定的一个。例如。当用户在其设备中删除并重新添加相同的帐户时,我不希望此帐户的联系人获得不同的ID,因为我无法在我的应用中匹配它们。< / p>

但是,只有Gmail同步适配器似乎保留了下面记录的承诺。遗憾的是,Exchange同步适配器没有SOURCE_ID更改,并且它绝对不是任何服务器ID,因为它的数量很少,如23:4

问题:有任何想法如何克服这个问题?我是否将ID用于预期用途?交换适配器是否存储&#34;永久服务器ID&#34;在其他领域?

文档SOURCE_ID must be unique for each account type and should be stable across syncs

  
      
  • 唯一:帐户的每个原始联系人都必须拥有自己的源ID。如果您不执行此操作,则会导致联系人出现问题   应用。请注意,同一帐户类型的两个原始联系人   可能具有相同的源ID。例如,原始联系人#Thomas; Thomas   金森&#34;对于该帐户emily.dickinson@gmail.com是允许的   拥有与原始联系人相同的来源ID#Thomas; Thomas Higginson&#34;为了   帐号emilyd@gmail.com。
  •   
  • 稳定:源ID是原始联系人在线服务数据的永久部分。例如,如果用户清除“联系人存储”   从应用程序设置和重新同步,恢复的原始联系人应该   拥有与以前相同的源ID。如果你不执行此操作,   快捷方式将停止工作。
  •   

2 个答案:

答案 0 :(得分:1)

LOOKUP_KEY是您正在寻找的。

  

LOOKUP_KEY

     

一个不透明的值,包含有关如何查找的提示   如果由于同步或聚合而更改了行ID,则联系。

您应该使用<CONTACT_ID, LOOKUP_KEY>来跟踪联系人。 在正常使用中,请使用CONTACT_ID值,但如果您的代码获得CONTACT_ID已更改(缺少或意外的联系人姓名)的提示,则可以使用LOOKUP_KEY来< strong>查找新的联系人ID。

或者,您可以使用Contacts.getLookupUri()获取一个URI,无论CONTACT_ID或LOOKUP_KEY实际值是什么,您都可以使用该URI快速查找联系人。

答案 1 :(得分:0)

首先,将Id存储在您的应用程序中并希望ID不会随着时间的推移而变化并且保持一致并不是一个好主意。你是对的SOURCE_ID&#39;与其他两个相比,它更加一致的列(CONTACT_ID是最脆弱的,而{&#39; RAW_CONTACT_ID&#39;至少在用户退出帐户和日志之前一直存在再次)。

我们有一个可以与联系人同步的帐户,我们过去常常将unique id保留在&#39; raw_contacts&#39;中的一个通用列中。表(SYNC1 - SYNC10)。因此,尽管Google建议帐户提供商以某种方式使用数据库列,但它完全取决于提供商。

要遵循的一般规则是,永远不要将这些id用于长期持久性,如果你这样做,期望它们改变。此外,由于您正在制作联系人应用程序,您显然需要某种参考密钥。在这种情况下,不要遵守所有帐户提供商将其密钥放在同一列中的规则。它很脆弱,但就是这样。

编辑 - 您应该使用ContactsColumns.LOOKUP_KEY(之前的答案也引用了相同的内容)。根据Google文档 -

  

LOOKUP_KEY

     

在API级别5中添加字符串LOOKUP_KEY包含的不透明值   如果其行ID因更改而更改,则提示如何查找联系人   同步或聚合。

     

常数值:&#34;查找&#34;

https://developer.android.com/reference/android/provider/ContactsContract.ContactsColumns.html#LOOKUP_KEY

如果您使用提供的API提供了联系人ID,则可以获取查找密钥。看这里 - https://developer.android.com/reference/android/provider/ContactsContract.Contacts.html