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