2013-03-20 1 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

에 500 변경에 도달하면 결국 당신이 있어야하지 않나요 실패 안에 작전을 클리어하면 (i 서 %의 BATCHSIZE == 0)? – Heinrisch

답변

7

ops에 대한 새 개체를 만들지 않습니다. 이후에 applyBatch을 호출하는 동안 이전에 적용된 작업을 다시 전달합니다. 처음 ops는 100 개 요소 (200)를 포함하고

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

고맙습니다. 시도해 보도록하겠습니다. –

관련 문제