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