Написание Realm Daos с закрытыми транзакциями

Мы начали интегрировать Realm в наш проект Android и столкнулись с небольшой проблемой. Мы переписали наш Daos с Realm, как это, например:

public class RealmAuthDao { public static RealmAuthToken getAuthToken() { Realm realm = RealmFactory.getAuthInstance(); RealmAuthToken token = realm.where(RealmAuthToken.class).findFirst(); return token; } 

но каждые несколько минут получили следующее исключение –

Msgstr "Невосстановимая ошибка.

Мы поняли, что нам нужно закрыть каждый экземпляр реального мира, который мы открыли во всем приложении, поэтому мы попробовали это:

 public class RealmAuthDao { public static RealmAuthToken getAuthToken() { Realm realm = RealmFactory.getAuthInstance(); RealmAuthToken token = realm.where(RealmAuthToken.class).findFirst(); realm.close // close the instance we were using return token; } 

Однако, когда мы это делали, всякий раз, когда мы пытались получить доступ к членам или свойствам объектов, которые мы запрашивали, он стал недействительным и было выбрано следующее исключение:

«Этот экземпляр Realm уже закрыт, что делает его непригодным».

Есть ли правильный способ реализовать Дао с царством? Или нам нужно просто запрашивать из экземпляра realm каждый раз?

Я делаю то, что я получаю экземпляр объекта realm в своей деятельности и передаю его классу dao для запроса. Они закрывают экземпляр после остановки активности и отлично работают, мои методы dao не являются статичными, хотя мне нужно и экземпляр dao и передать объект realm как параметр конструктора.

Да, вам нужно закрыть экземпляры Realm, но вы можете прочитать документацию о лучших практиках относительно их открытия и закрытия, в частности, что вы должны использовать onCreate/onDestroy для Activity / main thread, и вы должны использовать try(Realm realm = Realm.getDefaultInstance()) { блок для фонового потока, и любой метод, который должен использовать Realm, должен передать его как аргумент метода.

 public static RealmAuthToken getAuthToken(Realm realm) { return realm.where(RealmAuthToken.class).findFirst(); }