【问题标题】:How to delete a contact detail?如何删除联系方式?
【发布时间】:2017-10-17 21:26:42
【问题描述】:

我正在尝试从 android 中的联系人中删除详细信息。 例如,联系人有电子邮件和电话号码,假设我只想删除电话号码。 假设我已经从上一个查询中获得了详细信息的 ID。

我的搜索只找到了与删除整个联系人相关的主题,这已经对我有用。 这只是关于删除一个详细信息,即从 ContactsContract.Data 表中删除。

我的代码中的相关部分粘贴在下面,ID 也是已知的。 日志消息报告已成功删除 1 个条目,这是我所期望的。 但是当我切换到联系人应用程序时,细节仍然存在。即使从头开始重新启动该应用程序。 所以有些东西似乎仍然没有正确更新。

感谢您的帮助

private void deleteDetail(ContactDetail detail) {
    Uri detailsUri = ContactsContract.Data.CONTENT_URI;

    String selection = ContactsContract.Data._ID + " = ?";
    String[] selectionArgs = { String.valueOf(detail.getID()) };

    int result = 0;
    try {
        result = mProvider.delete(detailsUri, selection, selectionArgs);
    } catch (RemoteException e) {
        e.printStackTrace();
    }
    Log.d(LOGTAG, "deleteDetail() - id=" + detail.getID() + ", deleted "+result+" entries");
}

【问题讨论】:

    标签: android android-contacts


    【解决方案1】:

    您的代码似乎没问题,这可以解释为该联系人的详细信息中存在不止一次该电话。

    例如,如果您有WhatsappViber 或任何其他基于电话的消息传递应用程序,他们将为每个电话号码包含重复电话号码数据行的联系人添加一个RawContact,并且一些其他特定于应用的详细信息。

    这可能是由任何 RawContact 加入到包含您要删除的手机的 Contact 引起的。

    如果你真的想永久删除一个细节,你可以这样做:

    private void deleteDetail(long contactId, String phoneNumber) {
        Uri dataUri = Data.CONTENT_URI;
    
        String selection = Data.CONTACT_ID + " =? AND " + CommonDataKinds.Phone.NUMBER + " = ?";
        String[] selectionArgs = { String.valueOf(contactId), phoneNumber };
    
        try {
            int result = mProvider.delete(dataUri, selection, selectionArgs);
            Log.d(LOGTAG, "deleteDetail() - deleted: " + result + " entries");
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
    

    请注意,这将进行精确的电话比较,因此如果您为该联系人保存了两部电话,并且格式不同(破折号、国家代码等),则不会全部匹配。 如果您的目标是 Android Jelly Beans 及更高版本,您可以使用 CommonDataKinds.Phone.NORMALIZED_NUMBER 并将其与请求的电话号码的 E164 格式进行比较(请参阅 this

    【讨论】:

    • 我不相信这里是这种情况,原因有两个:a) 我在模拟器中运行,没有我使用的其他联系人类型,只有我的联系人'正在为这些测试创建,主要是通过代码 b) 类似于我尝试使用以下代码删除的建议:更改选择以删除所有联系人的 all 电话详细信息 String selection = ContactsContract.数据.MIMETYPE + " = ?"; String[] selectionArgs = {ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE };
    • 如果您在删除该联系人后查询该联系人的电话号码,您是否会再次找回已删除的电话?
    • 奇怪的是 - 没有。从程序的角度来看,数据库似乎是正确的。不解……
    • 呃——我终于在代码的其他地方找到了我自己的错误:上面的代码确实按设计工作!该代码是我的同步适配器的回归测试的一部分,它在删除后一次又一次地错误地重新创建了细节。因此,通过代码检查数据库会产生我所期望的结果,在联系人应用程序中手动检查它,同步适配器足够快以重新创建它。我将关闭这个作为用户错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多