我知道在某些手机上联系ID即使在重启时也会发生变化,但我无法在自己的手机上重现这一点。但我可以重现以下案例,并想知道这个案例是否至少可以解决:
ContentProvider
ContactProvider
读取联系人=>我得到数据集1ContentProvider
ContentProvider
读取联系人=>我得到数据集2结果:
在数据集1和数据集2之间,我没有看到任何一致的数据。
例如:
ContactsContract.Data.CONTACT_ID
=>更改,例如从598
到679
ContactsContract.Data.LOOKUP_KEY
=>也有变化,例如: 3514i2b4948808eec75c9.3789r593-2D374B39.2797r594-2D374B39
到3514i2b4948808eec75c9.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 "")
}
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_ID
或LOOKUP_KEY
的实际值是什么,您都可以使用它来快速找到联系人。