realm-java: ConcurrentModificationException when using iterators methods

Hi, I have such exception even I using iterators methods: Realm version 0.75.1, Android studio 1.0rc2

Caused by: java.util.ConcurrentModificationException: No outside changes to a Realm is allowed while iterating a RealmResults. Use iterators methods instead.
            at io.realm.RealmResults.assertRealmIsStable(RealmResults.java:405)
            at io.realm.RealmResults.access$200(RealmResults.java:44)
            at io.realm.RealmResults$RealmResultsIterator.hasNext(RealmResults.java:422)
            at com.coachesdirectory.coach.db.RealmHelper$5.doInBackground(RealmHelper.java:360)
            at com.coachesdirectory.coach.db.RealmHelper$5.doInBackground(RealmHelper.java:347)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)

Here is part of my code:

****AsyncTask*****
List<SchoolResult> favoriteSchools = params[0];
Realm realm = Realm.getInstance(context);
realm.beginTransaction();

// Set all schools to remove
RealmResults<RealmSchoolResult> markToRemove = realm.where(RealmSchoolResult.class)
                        .equalTo("userAccountId", userId)
                        .findAll();
Iterator<RealmSchoolResult> schoolResultIterator = markToRemove.iterator();
while (schoolResultIterator.hasNext()) { // Crash at this line
  RealmSchoolResult realmSchoolResult = schoolResultIterator.next();
  realmSchoolResult.setNeedRemove(true);
}

About this issue

  • Original URL
  • State: closed
  • Created 10 years ago
  • Comments: 40 (17 by maintainers)

Commits related to this issue

Most upvoted comments

The standard List.remove() method doesn’t work for normal ArrayList iterators either . You should use the Iterator.remove() method instead, it ensures that the iterator count isn’t counting wrong https://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html#remove():

Iterator it = oldPlaceOfBike.getBikes().iterator();
while(it.hasNext()) {
  BikeEntity bike = it.next();
  if (bike.getUid().equals(bikeWithNewInformation.getUid())) {
        it.remove();
  }
}

Fixed in 0.89