2015-09-14 57 views
0

Android的境界,我想這樣的代碼: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. 

如何解決呢?

回答

0

在迭代期間不能更改對象。您需要先手動將所有對象複製到另一個列表,然後遍歷它們

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

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

我用同樣的異常試過.. – ebnbin

+0

@ebnbin,我已經更新了我的回答,對我的工作 – bananabastard

+0

尼斯,它的作品!謝謝! – ebnbin

1

使用一個好的舊for循環。

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

問題解決。不管怎麼說,還是要謝謝你! – ebnbin

0

由於某種原因,無法在foreach循環中執行此操作,而是可以使用normal循環。

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

0.89.0中的變化允許發生這種情況,但之前的規範解決方案是使用normal for 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();