我正在尝试从android中的联系人中删除详细信息。 例如,联系人有电子邮件和电话号码,假设我想删除电话号码。 假设我已经拥有上一个查询中详细信息的ID。
我的搜索只找到了与删除整个联系人相关的主题,这对我来说很有用。 这是关于仅删除详细信息,即从 ContactsContract.Data 表中删除。
我的代码中的相关部分粘贴在下面,ID已经知道了。 日志消息报告已成功删除1个条目,这是我的预期。 但是,当我切换到联系人应用程序时,细节仍然存在。即使从头开始重新启动该应用程序。 所以某些东西似乎仍未正确更新。
感谢您的帮助
private void deleteDetail(ContactDetail detail) {
Uri detailsUri = ContactsContract.Data.CONTENT_URI;
String selection = ContactsContract.Data._ID + " = ?";
String[] selectionArgs = { String.valueOf(detail.getID()) };
int result = 0;
try {
result = mProvider.delete(detailsUri, selection, selectionArgs);
} catch (RemoteException e) {
e.printStackTrace();
}
Log.d(LOGTAG, "deleteDetail() - id=" + detail.getID() + ", deleted "+result+" entries");
}
答案 0 :(得分:0)
您的代码似乎没问题,可以解释的是,该联系人的详细信息中存在多一次该手机。
例如,如果您有Whatsapp
,Viber
或任何其他基于电话的消息传递应用,他们会为每个有电话号码的联系人添加RawContact
重复的电话号码数据行,以及其他一些应用程序特定的详细信息。
这可能是因为RawContact
加入了包含您尝试删除的手机的Contact
的{{1}}。
如果您确实要永久删除详细信息,可以执行以下操作:
private void deleteDetail(long contactId, String phoneNumber) {
Uri dataUri = Data.CONTENT_URI;
String selection = Data.CONTACT_ID + " =? AND " + CommonDataKinds.Phone.NUMBER + " = ?";
String[] selectionArgs = { String.valueOf(contactId), phoneNumber };
try {
int result = mProvider.delete(dataUri, selection, selectionArgs);
Log.d(LOGTAG, "deleteDetail() - deleted: " + result + " entries");
} catch (RemoteException e) {
e.printStackTrace();
}
}
请注意,这将进行精确的手机比较,因此,如果您为该联系人保存了两部手机,使用不同的格式(短划线,国家/地区代码等),则不会与所有手机相匹配。 如果您定位Android Jelly Beans及以上版本,则可以使用CommonDataKinds.Phone.NORMALIZED_NUMBER并将其与所请求电话号码的E164格式进行比较(请参阅this)