Я использую RealmDB и, согласно документации, лучше всего получить экземпляр БД с помощью методов onCreate и очистить его с помощью onDestroy, пока все хорошо - я сделал это.
Поскольку у нас есть несколько схем для различных объектов данных, я хочу сделать мой код чище, используя что-то вроде этого:
interface RealmOwner : RealmOwnerBase {
val realmContainer: BaseRealmContainer
override val configurationA: Realm
get() = realmContainer.configurationA
override val configurationB: Realm
get() = realmContainer.configurationB
abstract class BaseRealmContainer {
lateinit var configurationA: Realm
lateinit var configurationB: Realm
}
open class RealmContainer
: BaseRealmContainer() {
open fun initRealm() {
configurationA = RealmFactory.configurationA
configurationB = RealmFactory.configurationB
}
open fun closeRealm() {
listOf(configurationA, configurationB).forEach { it.close() }
}
}
class LifecycleRealmContainer(lifecycle: Lifecycle)
: RealmContainer(), LifecycleObserver {
init {
lifecycle.addObserver(this)
}
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
override fun initRealm() {
super.initRealm()
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
override fun closeRealm() {
super.closeRealm()
}
}
}
Действия и фрагменты могут наследоваться от "RealmOwner" и реализовывать обязательный realmContainer с использованиемЗатем «LifecycleRealmContainer» и, передав в него свой жизненный цикл, - initRealm будет вызываться с «onCreate», а «closeRealm» - с «onDestroy».
Это делается для того, чтобы во время их OnCreateВы можете запросить БД для инициализации.Проблема заключается в том, что обратный вызов LifecycleEvent выполняется после , когда вызывается фактический метод onCreate.Поэтому - экземпляры БД не инициализируются.
class ExampleActivity: AppCompatActivity(), RealmOwner {
override val realmContainer = RealmOwner.LifecycleRealmContainer(lifecycle)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
configurationA.where<SomeRealmObject>().findAll() // object isn't initialized error
}
}
Вопрос в том, есть ли для меня хороший чистый способ инициализации экземпляров БД с помощью инструмента "LifecycleObserver" до В операции / фрагменте, который я пытаюсь инициализировать, вызывается метод onCreate?