Поздний ответ, но, может быть, это все равно поможет:
Если вы посмотрите на исходный код ContactsProvider и поищите «matcher.addURI» (, не удивляйтесь, если он прекратит загрузку в середине ... он возобновит загрузку после минуты или две ), затем вы видите, что у него есть конечный набор схем URI, которые он может обрабатывать. Он имеет обработчик для «телефонов / #», но не для «телефонов», который вам нужен.
Это означает, что просто нет кода для удаления всех телефонных номеров, вы должны сначала получить идентификаторы всех номеров, а затем удалять каждый из них по очереди. Конечно, это требует гораздо больше ресурсов процессора и памяти, но по крайней мере это работает.
Следующий код удаляет конкретный номер. Имейте в виду, что я не тестировал этот код, но он на 90% идентичен коду, который я использую для удаления всех номеров данного человека, который нуждается в аналогичной обработке, потому что Android не может удалить "люди / # / телефоны", но " люди / # / телефоны / # "
РЕДАКТИРОВАТЬ: Я только что понял, что я неправильно понял вопрос. Я думал, что вы хотели бы удалить номер телефона, что мой код делает. Но теперь я вижу, что вы хотите удалить контакт.
private void deletePhoneNumber(Uri peopleUri, String numberToDelete) {
Uri.Builder builder = peopleUri.buildUpon();
builder.appendEncodedPath(People.Phones.CONTENT_DIRECTORY);
Uri phoneNumbersUri = builder.build();
String[] mPhoneNumberProjection = { People.Phones._ID, People.Phones.NUMBER };
Cursor cur = resolver.query(phoneNumbersUri, mPhoneNumberProjection,
null, null, null);
ArrayList<String> idsToDelete = new ArrayList<String>();
if (cur.moveToFirst()) {
final int colId = cur.getColumnIndex(People.Phones._ID);
final int colNumber = cur.getColumnIndex(People.Phones.NUMBER);
do {
String id = cur.getString(colId);
String number = cur.getString(colNumber);
if(number.equals(numberToDelete))
idsToDelete.add(id);
} while (cur.moveToNext());
}
cur.close();
for (String id : idsToDelete) {
builder.encodedPath(People.Phones.CONTENT_DIRECTORY + "/" + id);
phoneNumbersUri = builder.build();
resolver.delete(phoneNumbersUri, "1 = 1", null);
}
}
Код немного многословен, потому что он делает два предположения:
- может быть несколько строк для удаления (например, номер сохраняется дважды)
- может быть небезопасно получить курсор, удалить строку и продолжать использовать курсор
Оба предположения обрабатываются сначала сохранением idsToDelete
в ArrayList
, а затем удалением.
Вы также можете подумать о нормализации искомого числа и использовать вместо него столбец People.Phones.NUMBER_KEY
, поскольку он содержит числа в нормализованной форме.