2011-09-08 10 views
7

Sto lavorando a Test di unità per la mia app per Android e sto facendo molto con i Contatti. Devo inserire i contatti nei fornitori di contenuti Android e cancellarli dopo aver eseguito i miei test. Il problema è che non vengano effettivamente cancellati:Eliminazione di contatti (non elaborati) in Android 2.x

inserzione:

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

Metodo di eliminazione 1 (restituisce il numero di contatti prime, ma in realtà non vengono eliminati):

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

Metodo di cancellazione 2 (stesso risultato del metodo di cancellazione 1, ma approccio diverso):

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

Il metodo di eliminazione per Contatti funziona, ma il metodo di eliminazione per Contatti non elaborati restituirà un valore falso. Mi "dirà" che ha cancellato tutti i contatti, ma quando eseguo il mio prossimo test case, i vecchi contatti grezzi possono ancora essere trovati (cioè il conteggio dei contatti inseriti rispetto ai contatti presenti è sbagliato). Nota: tutti i test vengono eseguiti sull'emulatore Android.

Qualche idea su come risolvere questo problema?

Ho visto una domanda simile qui: How to delete a contact? - ma la soluzione non sembra risolvere il problema dato neanche.

risposta

19

Come wiseideal già parlano del modo in cui si eliminano i rawcontacts imposterà solo il "cancellato" -Flag a 1.

Quello che dovete fare è impostare il caller_is_syncadapter bandiera nel vostro URI true in questo modo:

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

E quindi utilizzare questo nuovo URI per chiamare il metodo 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 corrispondente nella documentazione è here (O perations-> delete).

Spero che questo aiuti e felice di codifica :)

+0

L0rdAli3n, è appena guadagnato qualche buon karma per aiutare un uomo disperato :) –

+0

Sono contento di aver potuto aiutare :) –

+0

Ho appena realizzato che ho dimenticato di segnare questa risposta corretto - meglio tardi che mai @ChristophHaefner? – benfwirtz

0

Sto lavorando allo stesso problema. Ho trovato che la colonna di eliminazione è impostata su 1 una volta che "lo elimina". Quindi penso contentresolver non cancella fisicamente i dati rawcontact, semplicemente imposta un flag di cancellazione. Forse dovremmo evitare questi tag.

Problemi correlati