2013-03-20 4 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); 
    } 

私は過去の質問を見てきましたが、ほとんどが挿入ではなく更新に関連しています。

私のアプリケーションは、ユーザーがすべての電話番号を標準化することを可能にする「連絡先番号フォーマッタ」ですので、私は一度にこれほど多くのレコードを更新したい理由があります電話で簡単に。私は、ユーザーが1回のバッチで更新したいレコードの数を制御することはできません。 (https://play.google.com/store/apps/details?id=angel.phoneformat

+1

に500の変更は、あなたがもし(I%のバッチサイズ== 0)の内側にOPSをクリアしてはいけません達した場合、最終的には失敗しますか? – Heinrisch

答えて

7

opsの新しいオブジェクトを作成していません。その後のapplyBatchの呼び出しでは、以前に適用された操作も戻します。初めてopsは200、その後、100個の要素が含まれており、それが

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

ありがとう、私はそれを試してみましょう。 –

関連する問題