我使用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”继承,并使用“ LifecycleRealmContainer”实现必需的realmContainer,并将其生命周期传递给它,然后-将用“ onCreate”调用“ initRealm”,并用“ 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
}
}
问题是-在我尝试初始化的活动/片段中调用onCreate方法之前,有没有一种很好的干净方法让我使用“ LifecycleObserver”工具初始化数据库实例? ?