遅い答えですが、とにかく役立つかもしれません:
ContactsProvider のソース コードを見て「matcher.addURI」を検索すると (途中で読み込みが停止しても驚かないでください... 1 ~ 2 分後に読み込みが再開されます)、処理できる URI スキームの有限セット。「phones/#」のハンドラーがありますが、「phones」のハンドラーはありません。これが必要です。
つまり、すべての電話番号を削除するコードはありません。最初にすべての番号の ID を取得してから、一度に 1 つずつ削除する必要があります。もちろん、これにはより多くの CPU とメモリ リソースが必要ですが、少なくとも機能します。
次のコードは、特定の番号を削除します。私はこのコードをテストしていませんが、特定の人のすべての番号を削除するために使用するコードと 90% 同一であることに注意してください。Android は "people/#/phones" を削除できませんが、"人/#/電話/#"
編集: 質問を誤解していたことに気づきました。私のコードが行う電話番号を削除したいと思いました。しかし今、連絡先を削除したいことがわかりました。
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);
}
}
このコードは、次の 2 つの前提があるため、少し冗長です。
- 削除する行が複数ある可能性があります (たとえば、番号が 2 回保存されます)。
- カーソルを取得し、行を削除し、カーソルを使い続けることは安全ではない可能性があります
両方の仮定は、最初に を に格納してから削除することによって処理されidsToDelete
ますArrayList
。
正規化された形式の数値が含まれているため、検索する数値を正規化し、People.Phones.NUMBER_KEY
代わりに列を使用することも検討してください。