删除所有联系人的号码

时间:2015-01-28 19:29:32

标签: android android-contentprovider android-contentresolver

以下查询失败,我不确定原因。它应该删除传递给方法的字符串列表中出现的所有数字。我首先怀疑MIME类型但忽略"喜欢 ? 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();
}

1 个答案:

答案 0 :(得分:1)

检查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();
}