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();
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();