Удаление (Raw) контактов в Android 2.x

Я работаю над Unit Tests для моего приложения для Android, и много делаю с контактами. Мне нужно вставлять контакты в Провайдеры содержимого Android и удалять их после запуска моих тестов. Проблема в том, что они фактически не удаляются:

Вставка:

ArrayList<ContentProviderOperation> contactOps = new ArrayList<ContentProviderOperation>(); int backRefIndex = 0; Random r = new Random(); contactOps.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null) .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null) .build()); contactOps.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, backRefIndex) .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, "Sample Name" + r.nextInt()) .build()); contactOps.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, backRefIndex) .withValue(ContactsContract.CommonDataKinds.Phone.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, "020" + r.nextInt()) .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, r.nextInt(20) .build()); try { ContentProviderResult[] result = context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, contactOps); } catch (Exception e) { e.printStackTrace(); } 

Метод удаления 1 (возвращает количество сырых контактов, но фактически их не удаляют):

 int deletedRawContacts = context.getContentResolver().delete(ContactsContract.RawContacts.CONTENT_URI, ContactsContract.RawContacts._ID + " >= ?", new String[]{"0"}); 

Метод удаления 2 (тот же результат, что и метод удаления 1, но другой подход):

 private static int deleteAllRawContacts(Context context) { ContentResolver cr = context.getContentResolver(); Cursor cur = cr.query(ContactsContract.RawContacts.CONTENT_URI, null, null, null, null); int count = 0; while (cur.moveToNext()) { try { String contactId = cur.getString(cur.getColumnIndex(ContactsContract.RawContacts._ID)); count += cr.delete(ContactsContract.RawContacts.CONTENT_URI, ContactsContract.RawContacts._ID + " = ?", new String[]{contactId}); } catch (Exception e) { System.out.println(e.getStackTrace()); } } return count; } 

Метод удаления для контактов работает, но метод удаления для Raw Contacts возвращает ложное значение. Он «скажет» мне, что он удалил все контакты, но когда я запустил свой следующий тестовый пример, старые Raw Contacts все еще можно найти (т. Е. Количество вставленных контактов и настоящих контактов неверно). Примечание. Все тесты проводятся на эмуляторе Android.

Есть идеи, как это решить?

Я видел аналогичный вопрос здесь: Как удалить контакт? – но решение, похоже, тоже не решает данную проблему.

Как уже упоминалось выше, как вы удаляете свои rawcontacts, только установите «deleted» -flag в 1.

Что вам нужно сделать, так это установить флаг caller_is_syncadapter в вашем URI следующим образом:

 RawContacts.CONTENT_URI.buildUpon().appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true").build() 

И затем используйте этот новый URI для вызова метода delete:

 int deletedRawContacts = context.getContentResolver().delete(RawContacts.CONTENT_URI.buildUpon().appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true").build(), ContactsContract.RawContacts._ID + " >= ?", new String[]{"0"}); 

Соответствующая часть в документации находится здесь (Operations-> delete).

Надеюсь, это поможет и счастливое кодирование 🙂

Я работаю над той же проблемой. Я обнаружил, что столбец delete установлен в 1 после того, как я «удалю» его. Поэтому я думаю, что contentresolver не удаляет данные rawcontact физически, он просто устанавливает флаг удаления. Может быть, мы должны избегать этих тегов.