直接 delete(RawContacts.CONTENT_URI, ...) 會刪除整個聯系人。需針對 Data 表特定行(MIMETYPE=Phone.CONTENT_ITEM_TYPE)構建 ContentProviderOperation 精確刪除單個電話號碼。
ArrayList ops = new ArrayList<>();
ops.add(ContentProviderOperation.newDelete(Data.CONTENT_URI)
.withSelection(Data._ID + "=? AND " + Data.MIMETYPE + "=?",
new String[]{String.valueOf(dataId), Phone.CONTENT_ITEM_TYPE})
.build());
try {
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
} catch (RemoteException | OperationApplicationException e) {
e.printStackTrace();
}
Data.CONTENT_URI:聯系人數據表通用 URI。Data._ID:具體數據行的唯一 ID(非聯系人 ID)。Data.MIMETYPE:區分數據類型,電話為 Phone.CONTENT_ITEM_TYPE (vnd.android.cursor.item/phone_v2)。applyBatch:原子性執行多個操作。// 根據電話號碼查詢對應的 Data 表 _ID
Cursor c = resolver.query(Phone.CONTENT_URI, new String[]{Data._ID},
Phone.NUMBER + "=?", new String[]{number}, null);
if (c.moveToFirst()) {
long dataId = c.getLong(0);
// 執行上述刪除操作
}
c.close();
精準定位 Data 表行,刪除單個電話不影響其他聯系信息。