write unit tests test support studio run library instrumented example and activity android unit-testing android-emulator contacts

android - tests - unit test espresso



Eliminar contactos(sin procesar) en Android 2.x (2)

Estoy trabajando en pruebas unitarias para mi aplicación de Android, y estoy haciendo mucho con 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 en realidad:

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 (el mismo resultado que el método de eliminació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 para Contactos funciona, pero el método de eliminación para Contactos sin formato devolverá un valor falso. Me "dirá" que eliminó todos los contactos, pero cuando ejecuto mi siguiente caso de prueba, aún se pueden encontrar los antiguos contactos crudos (es decir, el número de contactos insertados frente a los contactos actuales es incorrecto). Nota: Todas las pruebas se realizan en el emulador de Android.

¿Alguna idea de como resolver esto?

Vi una pregunta similar aquí: ¿cómo eliminar un contacto? - pero la solución tampoco parece resolver el problema dado.


Estoy trabajando en el mismo problema. Descubrí que la columna de eliminación está configurada en 1 una vez que la "eliminé". Así que creo que contentresolver no borra físicamente los datos de contacto sin procesar, simplemente establece una marca de eliminación. Tal vez deberíamos evitar esta etiqueta.


Como ya se mencionó en el comentario sobre la manera en que eliminas tus contactos en bruto, solo establecerá el indicador "eliminado" en 1.

Lo que debe hacer es configurar el caller_is_syncadapter-flag en su URI en verdadero así:

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

Y luego use este nuevo URI para llamar al método de eliminación:

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-> eliminar).

Espero que esto ayude y feliz codificación :)