Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Eliminación de contactos (crudos) en Android 2.x

Estoy trabajando en pruebas de unidad para mi aplicación de Android, y estoy haciendo mucho con los contactos. Tengo que insertar contactos en los proveedores de contenido de Android y eliminarlos después de ejecutar mis pruebas. El problema es que no se eliminan realmente:

Inserción:

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(); } 

Método de eliminación 1 (devuelve el número de contactos sin procesar, pero en realidad no se eliminan):

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

Método de eliminación 2 (mismo resultado que el método de deleción 1, pero enfoque diferente):

 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; } 

El método de eliminación de Contactos funciona, pero el método de eliminación de Contactos sin formato devolverá un valor falso. Me "dice" que borró todos los contactos, pero cuando ejecuto mi próximo caso de prueba, todavía se pueden encontrar los antiguos contactos crudos (es decir, el recuento de contactos insertados vs. contactos actuales es incorrecto). Nota: Todas las pruebas se realizan en el emulador de Android.

¿Alguna idea de como resolver esto?

He visto una pregunta similar aquí: ¿Cómo eliminar un contacto? – pero la solución tampoco parece solucionar el problema dado.

  • ¿Cómo puedo usar Active Android con una base de datos en memoria para las pruebas de unidad usando Robolectric?
  • ¿Cuál es la forma más rápida de ejecutar pruebas de unidad en Android
  • Prueba de unidad de Android con Retrofit2 y Mockito o Robolectric
  • Configuración de un directorio de activos personalizados para las pruebas unitarias en Android Studio
  • Ejecución de una prueba de unidad específica con gradle
  • Combine la cobertura jacoco de androidTest y pruebe
  • ¿Hay alguien por ahí usando Robolectric sin Maven en IntelliJ?
  • Robolectric + OkHttp + retrofit + prueba de unidad rxJava
  • 2 Solutions collect form web for “Eliminación de contactos (crudos) en Android 2.x”

    Como wiseideal ya mencionó la forma en que elimina su rawcontacts solo establecerá el "deleted" -flag a 1.

    Lo que debe hacer es configurar el indicador caller_is_syncadapter en su URI como true:

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

    Y luego use este nuevo URI para llamar al método delete:

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

    La parte correspondiente en la documentación está aquí (Operaciones-> borrar).

    Espero que esto ayude y codificación feliz 🙂

    Estoy trabajando en la misma edición. Encontré que la columna de la cancelación se fija a 1 una vez que "la suprimo". Entonces pienso que el contentresolver no elimina los datos del rawcontact físicamente, apenas fijó un flag.Maybe de la señal que debemos evitar estas etiqueta.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.