多くの連絡先を更新する必要があるアプリを開発していて、次のエラーが表示されています。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);
}
私は過去の質問を見てきましたが、ほとんどが挿入ではなく更新に関連しています。
- Insertion of thousands of contact entries using applyBatch is slow
- Whats the fastest way to create large numbers of contacts?
私のアプリケーションは、ユーザーがすべての電話番号を標準化することを可能にする「連絡先番号フォーマッタ」ですので、私は一度にこれほど多くのレコードを更新したい理由があります電話で簡単に。私は、ユーザーが1回のバッチで更新したいレコードの数を制御することはできません。 (https://play.google.com/store/apps/details?id=angel.phoneformat)
に500の変更は、あなたがもし(I%のバッチサイズ== 0)の内側にOPSをクリアしてはいけません達した場合、最終的には失敗しますか? – Heinrisch