2013-03-20 15 views
6

Tôi đang phát triển một ứng dụng cần cập nhật nhiều địa chỉ liên hệ và tôi gặp phải lỗi sau.Cập nhật hàng loạt của hơn 500 địa chỉ liên hệ

android.content.OperationApplicationException: Quá nhiều hoạt động của nhà cung cấp nội dung giữa các điểm sản lượng. Số hoạt động tối đa trên mỗi điểm sản lượng là 500

Tôi đã cố gắng chia các liên hệ thành các phần nhỏ hơn để cập nhật, nhưng tôi vẫn gặp lỗi tương tự. Điều tốt là bây giờ, một số địa chỉ liên lạc được cập nhật (trước đây 0 địa chỉ liên lạc được cập nhật). Bất kỳ gợi ý nào có thể giúp tôi được đánh giá cao.

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

Tôi đã xem xét các câu hỏi trong quá khứ, nhưng chúng chủ yếu liên quan đến chèn, không cập nhật.

Lý do tại sao tôi muốn cập nhật rất nhiều hồ sơ cùng một lúc là vì ứng dụng của tôi là một 'liên lạc số định dạng' cho phép người sử dụng để chuẩn hóa tất cả các số điện thoại trong điện thoại dễ dàng. Tôi không có quyền kiểm soát số lượng bản ghi mà người dùng muốn cập nhật trong một đợt. (https://play.google.com/store/apps/details?id=angel.phoneformat)

+1

Bạn có nên xóa thanh toán bên trong if (i% batchsize == 0) không? – Heinrisch

Trả lời

7

Bạn không tạo đối tượng mới cho ops. Trong các cuộc gọi tiếp theo tới applyBatch, bạn cũng sẽ chuyển các hoạt động đã áp dụng trước đó trở lại. Lần đầu tiên ops chứa 100 phần tử, sau đó 200 và cuối cùng không thành công khi đạt đến 500. Thay đổi thành

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

Cảm ơn bạn, hãy để tôi dùng thử. –

Các vấn đề liên quan