我有一种方法可以从联系人而不是整个联系人中删除特定号码。 (例如,如果名称有2个联系人,我让用户只删除一个号码,而不是整个号码)。 因此,对于包含单个号码的联系人,在删除单个号码后,联系人仅保留名称而不保留相关联的号码。 要使用下面给出的方法删除此类im,该方法可以正常工作,并且删除空的联系人,但它始终不起作用。 它有时行为不端,空洞的接触仍然存在。 有时候它有效。 它始终适用于包含多个数字的名称(删除数字时,使用以下方法删除空联系人)。 对于包含单个号码的姓名(联系人),它可以正常工作并删除空联系人(删除号码后),但有时只会删除。
以下是我如何从联系人中删除“只是一个号码”。
public void updateContact(String contactId, String type) {
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
/* String selectPhone = ContactsContract.Data.CONTACT_ID + "=? AND " + ContactsContract.Data.MIMETYPE + "='" +
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE + "'" + " AND " + ContactsContract.CommonDataKinds.Phone.TYPE + "=?";
String[] phoneArgs = new String[]{contactId, type};
ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI).withSelection(selectPhone, phoneArgs).build());
*/
ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI)
.withSelection(ContactsContract.RawContacts.Data._ID + "=? and " + ContactsContract.RawContacts.Data.MIMETYPE + "=?", new String[]{String.valueOf(contactId), ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE})
.build());
try {
getApplicationContext().getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
} catch (RemoteException e) {
e.printStackTrace();
} catch (OperationApplicationException e) {
e.printStackTrace();
}
}
这是我用来删除空联系人的方法,我在使用asynTask中的上述联系人删除号码后调用此方法。
public void emptyRemover(String s, String name) {
ContentResolver contentResolver = this.getContentResolver();
Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
while (cursor.moveToNext()) {
if (cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME)).equalsIgnoreCase(name)
/*||cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID)).equalsIgnoreCase(s)*/){
if (cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))==0) {
String lookupKey = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey);
contentResolver.delete(uri, null, null);
}
}
}
cursor.close();
}
答案 0 :(得分:2)
在ContactsContract.RawContacts
删除原始联系人时,您必须考虑到:
调用resolver.delete(...),不会立即删除a 原始联系人行。相反,它在原始联系人上设置DELETED标志 并从其聚合接触中移除原始接触。同步 然后,适配器从服务器中删除原始联系人并完成 通过再次调用resolver.delete(...)并传递来删除电话端 CALLER_IS_SYNCADAPTER查询参数。 某些同步适配器是只读的,这意味着它们只是同步 服务器端对手机的更改,但不是相反的。如果其中之一 原始联系人被标记为删除,它将保留在手机上。 然而,它将是有效的隐形,因为它不会成为其中的一部分 任何总联系人。
这就是为什么有时你会看到它被有效删除,有时候不会删除。因此,您必须调用两次删除操作,如下所示:
Uri rawUri = ContactsContract.RawContacts.CONTENT_URI.buildUpon().appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true").build();
ops.add(ContentProviderOperation.newDelete(ContactsContract.RawContacts.CONTENT_URI).
withSelection(ContactsContract.RawContacts._ID + "=? AND "
+ContactsContract.RawContacts.ACCOUNT_TYPE+ "=? AND "
+ContactsContract.RawContacts.ACCOUNT_NAME+ "=?"
,params).build()); //sets deleted flag to 1
ops.add(ContentProviderOperation.newDelete(rawUri).
withSelection(ContactsContract.RawContacts._ID + "=? AND "
+ContactsContract.RawContacts.ACCOUNT_TYPE+ "=? AND "
+ContactsContract.RawContacts.ACCOUNT_NAME+ "=?"
,params).build()); //erases
希望它有所帮助!