7

多くの連絡先を更新する必要があるアプリを開発していますが、次のエラーが発生します。

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

4

1 に答える 1

8

の新しいオブジェクトを作成していませんops。の後続の呼び出し中にapplyBatch、以前に適用された操作も元に戻します。最初opsは100個の要素が含まれ、次に200個が含まれ、最終的には500個に達すると失敗します。

if (i % batchsize == 0) {
    contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
    ops = new ArrayList<ContentProviderOperation>(100);
}
于 2013-03-26T06:43:44.453 に答える