我正在创建一个Android联系人应用,所以我经常阅读用户的联系人并将其存储在我的应用中。要做到这一点,我需要依赖某种ID
,以便我知道应该在我的应用中更新(或添加/删除)哪个联系人,Contacts Provider提供其中几个:
CONTACT_ID
是汇总联系人ID,RAW_CONTACT_ID
,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。如果你不执行此操作, 快捷方式将停止工作。
答案 0 :(得分:1)
LOOKUP_KEY
是您正在寻找的。 p>
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;
如果您使用提供的API提供了联系人ID,则可以获取查找密钥。看这里 - https://developer.android.com/reference/android/provider/ContactsContract.Contacts.html