从所有联系人中删除号码

Delete number from all contacts

以下查询失败,我不确定原因。它应该删除传递给该方法的字符串列表中出现的所有数字。我首先怀疑是 MIME 类型,但遗漏了 " LIKE ? AND " + Data.MIMETYPE + " = ?" 也无法解决。

public static void deleteAllNumbersFromAllContacts(final Context context, final List<String> numbers) {

    new Thread(new Runnable() {

        @Override
        public void run() {

            try {
                final ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
                for (String number : numbers) {

                    number = PhoneNumberUtil.toE164(number);

                    ops.add(ContentProviderOperation
                            .newDelete(ContactsContract.Data.CONTENT_URI)
                            .withSelection(
                                    ContactsContract.CommonDataKinds.Phone.NUMBER + " LIKE ? AND " + Data.MIMETYPE
                                            + " = ?",
                                    new String[] { "%" + number + "%",
                                            ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE }).build());
                }
                context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
            } catch (final Exception e) {
                e.printStackTrace();
            }
        }
    }).start();
}

检查 Android 数据库和您的参数中电话号码的格式。 Android 中的数字用空格保存(即 +12 345 678 910)并不少见。对于上述查询,您将无法匹配没有空格的数字。

为了避免这种歧义,您可以在查询中直接使用 REPLACE 等函数:instr() function SQLITE for Android? .

所以你的函数可能看起来像这样:

public static void deleteAllNumbersFromAllContacts(final Context context, final List<String> numbers) {

    new Thread(new Runnable() {

        @Override
        public void run() {

            try {
                final ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
                for (String number : numbers) {

                  number = PhoneNumberUtil.toE164(number);

                  ops.add(ContentProviderOperation
                    .newDelete(ContactsContract.Data.CONTENT_URI)
                    .withSelection(
                      "REPLACE(" + ContactsContract.CommonDataKinds.Phone.NUMBER
                        + ", ' ', '') LIKE ?", new String[] { "%" + number + "%" }).build());
                }
                context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
            } catch (final Exception e) {
                e.printStackTrace();
            }
        }
    }).start();
}