2011-09-08 29 views
7

estoy trabajando en pruebas unitarias para mi aplicación para Android, y estoy haciendo un montón 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 ellos no se elimina realmente:Borrado (Raw) Contactos en Android 2.x

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 borrado 1 (devuelve el número de contactos primas, pero que en realidad no se borran):

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 recuento de contactos insertados frente a contactos actuales es incorrecto). Nota: Todas las pruebas se realizan en el emulador de Android.

Alguna idea de cómo solucionar esto?

vi una pregunta similar aquí: How to delete a contact? - pero no parece la solución para resolver el problema dado cualquiera.

Respuesta

19

Como ya se ha mencionado wiseideal la forma en que borre sus rawcontacts sólo se configurará la "borrado" para imaginar e 1.

Lo que hay que hacer es fijar el caller_is_syncadapter-bandera en su URI para cierto como esto:

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

y luego usar 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 de la documentación es here (O peraciones-> eliminar).

Espero que esto ayude y feliz de codificación :)

+0

L0rdAli3n, que acaba de ganar un poco de buen karma para ayudar a un hombre desesperado :) –

+0

Me alegro de haber podido ayudar a :) –

+0

me he dado cuenta de que se olvidó de marcar esta respuesta como correcto, mejor tarde que nunca @ChristophHaefner? – benfwirtz

0

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

Cuestiones relacionadas