批量更新超过500个联系人

时间:2013-03-20 13:49:02

标签: android

我正在开发一个需要更新多个联系人的应用,我收到以下错误。

  

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 个答案:

答案 0 :(得分:7)

您没有为ops创建新对象。在随后调用applyBatch期间,您也会将之前应用的操作也传回。第一次ops包含100个元素,然后是200,最终在达到500时失败。更改为

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