【发布时间】:2020-08-09 20:08:46
【问题描述】:
当我通过以下代码更新联系人姓名时,它会在几秒钟内从原始联系人中创建新联系人,然后将其删除。
String where = ContactsContract.Data.RAW_CONTACT_ID+" = ? AND "+ContactsContract.Data.MIMETYPE+" = ?";
String[] agrs = {"1",ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE};
ArrayList<ContentProviderOperation> ops = new ArrayList<>();
ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
.withSelection(where, agrs)
.withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, "googleName")
.withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, null)
.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, "googleName")
.build());
try {
context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
} catch (Exception e) {
e.printStackTrace();
}
(此原始联系人来自具有 WhatsApp 号码的谷歌)。 在执行此更新之前,表格如下所示:-
原始表
Account type | contact_id | _id
com.google 6 1
com.whatsapp 6 2
联系表:
Display Name | _id | name_row_contact_id
Lorem 6 1
重命名操作后联系人表如下:-
Display Name | _id | name_row_contact_id
googleName | 6 | 1
Lorem | 6 | 2 //---> Why its happening ??
*更新操作几秒钟后,此 Lorem 将被删除 *
!!!发生这种情况时,我的应用程序认为添加了新联系人,然后再次删除:( !!!
我在更新联系人姓名时是否做错了什么?
请帮忙!
【问题讨论】:
-
您的更新代码看起来不错,这真的很奇怪,游标永远不能返回具有相同唯一 _id 的 2 行,所以我看不出您的联系人查询怎么可能返回两个具有相同 ID 的联系人。您可以发布您的联系人查询代码吗?
-
` 光标 cursorContact = context.getContentResolver().query( ContactsContract.Contacts.CONTENT_URI, null, null, null, null);`
-
尝试打印整个联系人行(您可以使用 DatabaseUtils.dumpCursor)并检查两个 _id 为 6 的联系人之间的差异,也许其中一个被标记为脏/已删除,这将向您的应用发出信号忽视。另外,你在哪个设备上测试这个?您是否尝试过使用其他制造商的其他设备?某些设备可能会在 ContactsContract API 中显示奇怪的行为
标签: android android-contacts android-contentresolver