更新联系人姓名会保留最后一个联系人一秒钟

Posted

技术标签:

【中文标题】更新联系人姓名会保留最后一个联系人一秒钟【英文标题】:updating contact name keeps the last contact for a second 【发布时间】: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 中显示奇怪的行为 【参考方案1】:

我已经找到了问题的原因和解决方案。

当我用行 id 更改名称时,显然它会重命名,但其他移动应用程序,例如 WhatsApp 也有在数据库中的名称尚未更改的条目。这就是为什么 Edge 7 设备在联系人表中创建新条目的原因,因为旧名称仍然存在于数据表中(由whatsApp 使用)。 在 WhatsApp 进行同步后,这个旧联系人会被删除。

解决方案:重命名的完美原因是如果您重命名不是按 row_id 而是按 contact_id。它还将重命名数据表中其他条目的名称。

    String where = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
            String[] agrs = contactId, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE;

【讨论】:

以上是关于更新联系人姓名会保留最后一个联系人一秒钟的主要内容,如果未能解决你的问题,请参考以下文章

PHP 单选按钮 - 出错后保留表单中的值

在 android 4.4 中更新联系人姓名

核心数据:如何根据姓名的第一个字母将联系人(实体)组织成部分?

如何从他的号码中获取联系人的姓名

使用本机反应在通知中显示联系人姓名

无法使用新字段更新联系人