【发布时间】:2019-08-22 20:58:51
【问题描述】:
在我当前的项目中,我们为不同的海豚有五个不同的领域实例。主要的架构版本现在是 5,我们希望摆脱它并完全干净地启动下一个(架构版本 6),因为我们启动了应用程序的 2.0.0 版本并且有一些主要的数据库更改。
问题是,有没有办法在构建新配置之前检查领域实例的旧架构版本?
我们已经尝试使用realmDeleteIfMigrationNeeded() 定义特定架构版本来删除领域,并为后续版本提供迁移类。这种方法的问题是,当用户的应用程序版本低于指定的模式版本并更新到具有更高版本的应用程序版本时,因此我们需要迁移异常。
我还在 realm, check schema version、https://github.com/realm/realm-java/issues/2645 和 https://github.com/realm/realm-java/issues/6049 找到了一个可能的解决方案,先执行 'val realm = DynamicRealm.getInstance(realmConfiguration)' 然后 'getSchemaVersion()' 但我们真的不知道如何这可能会起作用,因为当您实际必须设置架构版本时,您必须提供“RealmConfiguration”。
我将尝试澄清我的问题,我们有以下获取领域实例的方法
private val realmConfiguration = buildRealmConfiguration(realmInstance)
private fun buildRealmConfiguration(realmInstance: RealmInstance):
RealmConfiguration {
return realmInstance.run {
val realmBuilder = RealmConfiguration.Builder()
.name(getName())
.schemaVersion(schemaVersion.toLong())
if (this == RealmInstance.IN_MEMORY) {
realmBuilder.inMemory()
} else {
getMigration(realmBuilder, this)
}
realmBuilder.build()
}
fun getInstance(): Realm {
return Realm.getInstance(realmConfiguration)
}
enum class RealmInstance(val instance: String, val schemaVersion: Int) {
MAIN_DB(instance = "main_db", schemaVersion = 5),
DB2(instance = "db2", schemaVersion = 1),
...
fun getName() = instance
fun getMigration(
realmBuilder: RealmConfiguration.Builder,
realmInstance: RealmInstance
) {
when (realmInstance) {
MAIN_DB -> {
/*
Variable used to delete main_db Realm during migration from app version 1.x.x to version 2.0.0 due to a mayor schema change
*/
val migrateToAppVersion2 = realmInstance.schemaVersion <= 4
realmBuilder.apply {
modules(mainDbModule())
if (deleteRealm) {
deleteRealmIfMigrationNeeded()
} else {
migration(realmMigration!!)
}
}
}
...
理想的情况是在调用“getMigration()”之前检查数据库的实际架构版本,如果旧的架构版本属于应用程序的 v1.x.x,我们可以始终删除领域。
【问题讨论】: