持久联系人ID

问题描述 投票:0回答:1

我知道在某些手机上联系ID即使在重启时也会发生变化,但我无法在自己的手机上重现这一点。但我可以重现以下案例,并想知道这个案例是否至少可以解决:

  • 安装whatsapp - 它会将它的联系人添加到ContentProvider
  • ContactProvider读取联系人=>我得到数据集1
  • 删除whatsapp,重新安装它 - 它会再次将它的联系人添加到ContentProvider
  • ContentProvider读取联系人=>我得到数据集2

结果:

在数据集1和数据集2之间,我没有看到任何一致的数据。

例如:

ContactsContract.Data.CONTACT_ID =>更改,例如从598679 ContactsContract.Data.LOOKUP_KEY =>也有变化,例如: 3514i2b4948808eec75c9.3789r593-2D374B39.2797r594-2D374B393514i2b4948808eec75c9.2797r603-2D374B39.3789r670-2D374B39 *当然,有些raw ids保持不变,但是就我所见,没有完全接触的共同身份保持不变

我想要的是

我需要一个联系人的标识符,我可以在我的应用程序的数据库中持久化,并且在上述更改之后也可以使用。我需要一个联系人的标识符(不是原始联系人),原始联系人可能会在联系的生命周期中发生变化(如我上面描述的示例)...

我有什么想法可以解决这个问题吗?

为了完整起见,我在这里查询来自ContentProvider的数据,至少是光标:

 private fun getCursor(offset: Int?, count: Int?): Cursor? {
    val selection = arrayOf(
            ContactsContract.Data.RAW_CONTACT_ID,
            ContactsContract.Data.CONTACT_ID,
            ContactsContract.Data.LOOKUP_KEY,
            ContactsContract.Data.PHOTO_ID,
            ContactsContract.Data.DISPLAY_NAME,
            ContactsContract.Data.ACCOUNT_TYPE_AND_DATA_SET,
            ContactsContract.CommonDataKinds.Email.DATA,
            ContactsContract.CommonDataKinds.Phone.NUMBER,
            ContactsContract.CommonDataKinds.Phone.TYPE,
            ContactsContract.CommonDataKinds.Phone.LABEL,
            ContactsContract.Contacts.Data.MIMETYPE,
            ContactsContract.RawContacts.ACCOUNT_NAME,
            ContactsContract.CommonDataKinds.Phone.IS_PRIMARY,
            ContactsContract.Data.CONTACT_LAST_UPDATED_TIMESTAMP,
            ContactsContract.RawContacts.SOURCE_ID
    )

    return AppProvider.get().context.contentResolver.query(
            ContactsContract.Data.CONTENT_URI,
            selection, null, null,
            ContactsContract.Data.CONTACT_ID + " ASC" + if (offset != null && count != null) " limit $count offset $offset" else "")
}
android android-contacts contactscontract
1个回答
0
投票

LOOKUP_KEY是你的朋友。

LOOKUP_KEY

一个不透明值,包含有关如何通过同步或聚合更改其行ID的联系方式的提示。

所以它本身不是一个稳定的ID,但它有助于ContactsContract DB在发生变化时找出新的contactID。

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

您可以使用Contacts.getLookupUri(long, String)获取一个URI,无论CONTACT_IDLOOKUP_KEY的实际值是什么,您都可以使用它来快速找到联系人。

© www.soinside.com 2019 - 2024. All rights reserved.