2013-03-20 43 views
6

我正在開發一個需要更新許多聯繫人的應用程序,並且出現以下錯誤。批量更新超過500個聯繫人

android.content.OperationApplicationException:屈服點之間的內容提供者操作過多。每個屈服點的最大操作數是500

我試圖將聯繫人分成更小的塊來更新,但我仍然得到相同的錯誤。好的是,現在,一些聯繫人被更新(先前0個聯繫人被更新)。任何可以幫助我的建議非常感謝。

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

我已經看過過去的問題,但它們大部分都與插入有關,而不是更新。

我爲什麼要更新這麼多條記錄一次是因爲我的應用程序是一個「聯絡號碼格式」,允許用戶以標準化的所有電話號碼的原因在手機中輕鬆。我無法控制用戶想要在單個批次中更新的記錄數量。 (https://play.google.com/store/apps/details?id=angel.phoneformat

+1

你不應該最終失敗了清除裏面的OPS如果(I%BATCHSIZE == 0)? – Heinrisch 2013-03-25 15:48:16

回答

7

您沒有爲ops創建新對象。在隨後調用applyBatch期間,您還將以前應用的操作重新傳回。第一次ops包含100個元素,那麼200和當它達到500更改爲

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

謝謝,讓我試試看。 – 2013-03-29 06:44:49

相關問題