У меня есть метод, который удаляет определенное число из контакта, а не всего контакта. (Например, если имя имеет 2 контакта, я могу удалить только одно число, а не целое число). Следовательно, для контактов, содержащих одно число, после удаления для единственного номера контакт остается только с именем и без связанного номера. Чтобы удалить их, используя метод, приведенный ниже, метод работает нормально, а пустые контакты удаляются, но он не работает всегда. Иногда он ошибается, и пустой контакт остается. И иногда это работает. Он всегда работает для имени, содержащего более одного номера (когда номера удаляются, пустой контакт также удаляется с использованием метода ниже). Для имен (контактов), содержащих один номер, он работает правильно и удаляет пустой контакт (после удаления номера), но только иногда.android Контакты deleteation
Вот как 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();
}
При удалении последнего контакта ContactsContract.RawContacts, связанного с 'ContactsContract.Contacts', сам контакт автоматически удаляется, поскольку« Когда данные в таблице RawContacts или связаны с ней, измененные связанные контакты обновляются по мере необходимости », цитата из http://developer.android.com/reference/android/provider/ContactsContract.html –
Но вам действительно нужно сделать это дважды, если у вас уже есть синхронизатор? – Roel