2015-07-04 4 views
1

У меня есть метод, который удаляет определенное число из контакта, а не всего контакта. (Например, если имя имеет 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(); 

} 

ответ

1

При удалении исходного контакта в ContactsContract.RawContacts вы должны принять во внимание, что:

Заклятие resolver.delete (...), не сразу удалить сырые контакты строки. Вместо этого он устанавливает флаг DELETED на необработанный контакт и удаляет необработанный контакт из своего общего контакта. Затем адаптер sync удаляет необработанный контакт с сервера и завершает удаление на стороне телефона путем вызова функции 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 

Надеюсь, это поможет!

+0

При удалении последнего контакта ContactsContract.RawContacts, связанного с 'ContactsContract.Contacts', сам контакт автоматически удаляется, поскольку« Когда данные в таблице RawContacts или связаны с ней, измененные связанные контакты обновляются по мере необходимости », цитата из http://developer.android.com/reference/android/provider/ContactsContract.html –

+0

Но вам действительно нужно сделать это дважды, если у вас уже есть синхронизатор? – Roel