我知道在某些手机上,即使重新启动,联系人ID也会更改,但是我无法在自己的手机上重现此信息。但是我可以重现以下情况,并想知道这种情况是否至少可以解决:
ContentProvider
ContactProvider
中读取联系人=>我得到数据集1 ContentProvider
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
保持不变,但据我所知,没有完整联系人的通用ID保持不变
我想要的
我需要一个联系人标识符,该标识符可以保存在应用程序的数据库中,并且在进行上述更改后也可以使用。 我需要一个联系人(而不是原始联系人)的标识符,原始联系人可能会在联系人的整个生命周期中发生变化(就像我在上面描述的示例中一样)...
有什么主意可以解决这个问题吗?
代码
出于完整性考虑,以下是我从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 "")
}
答案 0 :(得分:0)
LOOKUP_KEY
是你的朋友。
LOOKUP_KEY
一个不透明值,其中包含有关如何查找 如果行号由于同步或聚合而发生变化,请联系。
因此,它本身并不是一个稳定的ID,但可以帮助ContactsContract数据库找出新的contactID,以防其发生更改。
您应该使用<CONTACT_ID, LOOKUP_KEY>
的对来跟踪联系人。
在正常使用中,请使用CONTACT_ID
值,但是如果您的代码得到CONTACT_ID
更改的提示(丢失或意外的联系人姓名),则可以使用LOOKUP_KEY
来< strong>找到新的联系人ID。
您可以使用Contacts.getLookupUri(long, String)获取一个URI,无论它的CONTACT_ID
或LOOKUP_KEY
实际值是多少,都可以使用它来快速查找联系人。