【问题标题】:Unable to delete specific number in a Contact in Android无法删除 Android 联系人中的特定号码
【发布时间】:2021-06-16 21:13:28
【问题描述】:

我正在开发一个应用程序,在该应用程序中我应该能够访问所有联系人,能够更新或删除任何联系人中的号码。

我想删除联系人中的几个号码。我正在使用 batchOperations 执行删除操作。

phone = ContactsContract.Data.RAW_CONTACT_ID + " = ? AND " +
        ContactsContract.Data.MIMETYPE + " = ? AND " +
        ContactsContract.CommonDataKinds.Phone._ID + " = ?";
String[] phoneArgs = new String[]{Integer.toString(rawContactId), ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE, String.valueOf(id)};
batchOperations.add(ContentProviderOperation.newDelete(Data.CONTENT_URI).withSelection(phone, phoneArgs).build());
this.mContext.getContentResolver().applyBatch("com.android.contacts", batchOperations);
batchOperations.clear();

我正在使用这部分代码从联系人中删除特定号码。使用调试器,对于示例删除操作,我发现值如下:

raw_contact_id = 4093
id = 21579

这些值对应于示例联系人中一组号码中的特定号码(“+814444444444”)。(请参阅下图)

但该号码仍然没有被删除。在过去的几个小时里,我一直在试图解决这个问题,但无法解决。请帮忙。

【问题讨论】:

    标签: android selection android-contentprovider contacts android-contacts


    【解决方案1】:

    您可以构建要删除的特定项目的 uri,而不是提供 selection + selectionArgs,如下所示:

    Uri phoneUri = ContentUris.withAppendedId(Data.CONTENT_URI, phoneId);
    batchOperations.add(ContentProviderOperation.newDelete(phoneUri).build());
    

    其他几点说明:

    1. 始终检查applyBatch 的返回值,如果为false,则说明您的代码/权限存在问题。
    2. 使用常量ContactsContract.AUTHORITY 代替硬编码字符串“com.android.contacts”。

    观察到的行为的另一个原因是电话“+814444444444”存储在多个RawContacts 上,这些RawContacts 聚合为一个联系人。 在这种情况下,即使您从 RawContact A 中正确删除了该行,联系人配置文件仍会从 RawContact B 中获取号码。

    当安装了某些应用程序(例如Whatsapp)时,电话号码尤其如此,这些应用程序往往会将联系人的电话号码复制到他们自己帐户下的单独RawContact

    如果是这个问题,您需要从所有持有该电话的联系人的RawContacts 中删除该电话号码。

    编辑

    以下是转储属于特定联系人的所有电话号码以及保存它们的原始联系人的方法:

    String selection = Data.CONTACT_ID + "=? AND " + Data.MIMETYPE + "=?";
    String[] selectionArgs = new String[] { contactId.toString(), Phone.CONTENT_ITEM_TYPE };
    String[] projection = new String[] { Data.CONTACT_ID, Data.RAW_CONTACT_ID, Data.DATA1 };
    
    Cursor cur = getContentResolver().query(Data.CONTENT_URI, projection, selection, selectionArgs, projection);
    DatabaseUtils.dumpCursor(cur);
    

    另外,请注意rawContactId 不是整数,而是长整数。

    【讨论】:

    • 我检查过,“applyBatch”工作正常。代码没有问题。
    • 您是否检查过该数据行是否可能来自其他原始联系人?
    • 你能告诉我如何检查吗?我检查了添加“newInsert”语句,它工作正常。但是 newDelete 不起作用
    • 我做了一件事。我关闭了联系人中的 GMail 同步并创建了一个新联系人。它存储在设备中。现在,当我从应用程序中删除时,我已经构建了它,它工作得很好。它也在从本地联系人中删除。但是,当 Gmail Sync 开启时,它不会删除。本地联系人中仍然存在已删除的号码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 2014-02-14
    相关资源
    最近更新 更多