一个迟到的答案,但无论如何它可能会有所帮助:
如果您查看ContactsProvider 的源代码并搜索“matcher.addURI”(如果它在中间停止加载,请不要感到惊讶......它会在一两分钟后恢复加载),然后您会看到它有一个它可以处理的有限 URI 方案集。它有一个“phones/#”的处理程序,但没有“phones”的处理程序,这是你需要的。
这意味着,没有删除所有电话号码的代码,您必须先获取所有号码的 ID,然后一次删除每个号码。当然,这需要更多的 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);
}
}
代码有点冗长,因为它做了两个假设:
- 可能有多行要删除(例如,数字被存储两次)
- 获取游标、删除行并继续使用游标可能不安全
这两个假设都是通过首先存储idsToDelete
在一个中ArrayList
然后删除来处理的。
您也可以考虑规范化您搜索的数字,并改用 Column People.Phones.NUMBER_KEY
,因为它包含规范化形式的数字。