2017-12-05 2 views
0

API에서 다운로드 한 데이터의 지속성 메소드로 영역을 사용하려고합니다. 오류가 나타납니다. *Realm IllegalStateException

그리고 나는 지속성 방법에있어 잘못된 것을 알지 못합니다. 지속성에 대한 나의 클래스는 다음입니다 :이 오류가 발생했을 때이 방법 loadHabitants(int indexFrom, int limit)을 사용

public class PersistenceManager { 

    @Inject 
    public PersistenceManager(){} 

    public void saveHabitants(final List<Habitant> habitants){ 

     Realm realm = Realm.getDefaultInstance(); // opens db 
     try { 
      realm.executeTransaction(new Realm.Transaction() { 
       @Override 
       public void execute(Realm realm) { 
        realm.insertOrUpdate(habitants); 
       } 
      }); 
     } finally { 
      realm.close(); 
     } 

    } 

    public void saveHabitant(final Habitant habitant){ 

     Realm realm = Realm.getDefaultInstance(); 
     try { 
      realm.executeTransaction(new Realm.Transaction() { 
       @Override 
       public void execute(Realm realm) { 
        realm.insertOrUpdate(habitant); 
       } 
      }); 
     } finally { 
      realm.close(); 
     } 

    } 

    public List<Habitant> loadHabitants(){ 

     Realm realm = Realm.getDefaultInstance(); 
     List<Habitant> results; 

     try { 
      results = realm.where(Habitant.class).findAll(); 
     } finally { 
      realm.close(); 
     } 

     return results; 
    } 

    public List<Habitant> loadHabitants(int indexFrom, int limit){ 

     Realm realm = Realm.getDefaultInstance(); 
     List<Habitant> results; 

     try { 
      results = realm.where(Habitant.class).findAll(); 
      results.subList(indexFrom, limit); 
     } finally { 
      realm.close(); 
     } 

     return results; 
    } 

    public Habitant loadHabitant(long id){ 

     Realm realm = Realm.getDefaultInstance(); 
     Habitant result; 

     try { 
      result = realm.where(Habitant.class).equalTo("id", id).findFirst(); 
     } finally { 
      realm.close(); 
     } 

     return result; 
    } 


} 

입니다.

답변

1

RealmResults는 지정된 스레드에 최소 하나의 Open Realm 인스턴스가있는 동안 액세스 자 당 지연로드를 통해 액세스 할 수 있습니다.

실제로 설명서를 언급하려고했지만 어떤 이유로 설명서를 찾을 수 없었습니다. 어쨌든 RealmResults는 느리게 액세스되므로 열려있는 Realm 인스턴스가 없으면 인스턴스가 무효화되고 더 이상 액세스 할 수 없습니다. 이것은 RealmObjects에서도 마찬가지입니다.

...RealmObjects and RealmResults are accessed through a lazy cache...

그래서 당신이 관리 RealmResults을 반환 할 수 없습니다, 당신은이 연결된 스레드 로컬 영역 인스턴스를 닫을 경우는, 열린 상태로 유지 기대 :

The docs 말 않습니다.


두 솔루션 :

1)가 제대로 간절히 전체 데이터를 평가 realm.copyFromRealm()를 사용하는 UI 스레드 및 백그라운드 스레드

2)에 영역 라이프 사이클을 관리하는 방법에 documentation 참조 설정하면 분리 된 사본이 작성됩니다. UI 스레드에서 copyFromRealm()을 사용하면이 작업은 자유로운 작업이 아니며 더 큰 데이터 세트로 인해 UI 스레드가 쉽게 정지 될 수 있습니다.

public List<Habitant> loadHabitants(int indexFrom, int limit){ 
    try(Realm realm = Realm.getDefaultInstance()) { 
     List<Habitant> results = realm.where(Habitant.class).findAll(); 
     results = new ArrayList<>(results.subList(indexFrom, limit)); 
     for(int i = 0, size = results.size(); i < size; i++) { 
      results.set(i, realm.copyFromRealm(results.get(i))); 
     } 
     return Collections.unmodifiableList(results); 
    } 
} 
관련 문제