2013-03-20 6 views
6

Sto sviluppando un'applicazione che ha bisogno di aggiornare molti contatti e sto ricevendo il seguente errore.Aggiornamento collettivo di oltre 500 contatti

android.content.OperationApplicationException: Troppe operazioni del provider di contenuti tra i punti di rendimento. Il numero massimo di operazioni per punto di snervamento è 500

Ho provato a rompere i contatti in blocchi più piccoli per l'aggiornamento, ma ottengo ancora lo stesso errore. La cosa buona è che ora alcuni contatti vengono aggiornati (in precedenza sono stati aggiornati 0 contatti). Qualsiasi suggerimento che possa aiutarmi è molto apprezzato.

Uri uri = ContactsContract.Data.CONTENT_URI; 
    String selectionUpdate = ContactsContract.CommonDataKinds.Phone._ID + " = ? AND " + ContactsContract.Contacts.Data.MIMETYPE + " = ? "; 

    int i = 0; 
    int numRowsUpdated = 0; 
    int batchsize = 100; 
    for (EntityPhone ep : eps) { 
     if (ep.isUpdateNumber()) { 

      //update only when checkbox is ticked 
      ops.add(ContentProviderOperation.newUpdate(uri) 
        .withSelection(selectionUpdate, new String[]{ep.getPhoneId(), ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE}) 
        .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, ep.getPhoneNumberNew()) 
        .build()); 

      i++; 
      if (i % batchsize == 0) { 

       i = 0; 
       ContentProviderResult[] count = contentResolver.applyBatch(ContactsContract.AUTHORITY, ops); 

       if (count != null) { 
        numRowsUpdated += count.length; 
        Log.i(TAG, "batch update success" + count.length); 
       } else { 

        Log.w(TAG, "batch update failed"); 
       } 
      } 
     } 
    } 

    if (i != 0) { 
     ContentProviderResult[] count = contentResolver.applyBatch(ContactsContract.AUTHORITY, ops); 
    } 

Ho esaminato le domande precedenti, ma sono principalmente correlate a inserimenti, non aggiornamenti.

La ragione per cui voglio aggiornare i tanti record in una volta è perché la mia domanda è un 'contatto serie formattatore' che permette all'utente di standardizza tutti i numeri telefonici nel telefono facilmente. Non ho il controllo del numero di record che gli utenti desiderano aggiornare in un singolo batch. (https://play.google.com/store/apps/details?id=angel.phoneformat)

+1

Non dovresti essere compensazione ops all'interno del if (i% batchsize == 0)? – Heinrisch

risposta

7

Non si sta creando un nuovo oggetto per ops. Durante le successive chiamate a applyBatch, si stanno passando anche le operazioni applicate in precedenza. La prima volta che ops contiene 100 elementi, poi 200 e, infine, non riesce quando raggiunge 500. Cambia per

if (i % batchsize == 0) { 
    contentResolver.applyBatch(ContactsContract.AUTHORITY, ops); 
    ops = new ArrayList<ContentProviderOperation>(100); 
} 
+0

Grazie, fammi provare. –