【发布时间】:2019-02-25 17:25:33
【问题描述】:
我知道在某些手机上,即使重新启动,联系人 ID 也会发生变化,但我无法在自己的手机上重现这一点。但我可以重现以下案例,并想知道这个案例是否至少可以解决:
- 安装whatsapp - 它会将它的联系人添加到
ContentProvider - 从
ContactProvider读取联系人 => 我得到数据集 1 - 删除 whatsapp,重新安装 - 它会将其联系人再次添加到
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 "")
}
【问题讨论】:
标签: android android-contacts contactscontract