Android 领域迭代器异常

Android Realm iterators exception

Android境界,我想这样编码:

public void updateChecked(MyModel model) {
    Realm.getDefaultInstance().beginTransaction();
    model.setChecked(true);
    Realm.getDefaultInstance().commitTransaction();
}

public void updateAllChecked() {
    RealmResults<MyModel> results = Realm.getDefaultInstance().where(MyModel.class).findAll();
    for (MyModel model : results) {
        updateChecked(model);
    }
}

调用 updateAllChecked() 时出错:

java.util.ConcurrentModificationException: No outside changes to a Realm is allowed while iterating a RealmResults. Use iterators methods instead.

如何解决?

您不能在迭代期间更改对象。您需要先手动将所有对象复制到另一个列表,然后遍历它们

List<MyModel> list = new ArrayList<>();
list.addAll(results);

realm.beginTransaction();
for (MyModel myModel : list){
    myModel.setChecked(true);
}
realm.commitTransaction();

使用一个很好的旧 for 循环。

for (int i = 0; i < results.size(); i++) {
   MyModel model = results.get(i);
   updateChecked(model);
}

出于某种原因,此操作不能在 foreach 循环内进行,您可以使用普通的 for 循环。

 for (int i = 0; i < results.size(); i++) {
        updateChecked( results.get(i))
    }

0.89.0 中的更改允许这种情况发生,但以前的规范解决方案是使用正常 for 循环的反向迭代。

realm.beginTransaction();
RealmResults<MyModel> results = realm.where(MyModel.class).equalTo("checked", false).findAll();
for(int i = results.size()-1; i >= 0; i--) {
    MyModel myModel = results.get(i);
    myModel.setChecked(true);
}
realm.commitTransaction();