在我目前的项目中,我们为不同的江豚提供了五个不同的realm实例。主要的模式版本现在是5,我们希望摆脱它,并完全干净地启动下一个(模式版本6),因为我们启动了应用程序的2.0.0版本,并且有市长数据库的更改。
问题是,有没有办法在构建新配置之前检查领域实例的旧模式版本?
我们已经尝试使用realmDeleteIfMigrationNeeded()定义特定的模式版本来删除realm,并为后续版本提供迁移类。这种方法的问题是,当用户的应用程序版本的模式版本低于指定的版本,并更新到具有更高版本的应用程序版本时,我们会有一个需要迁移的异常。
我还发现这里的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‘。
我将尝试澄清我的问题,我们有以下方法来获取realm实例
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,则允许我们始终删除realm。
发布于 2019-04-02 21:54:50
您可以使用RealmMigration实现来检查新旧版本:
public class CustomRealmMigration implements RealmMigration {
@Override
public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
//do what you want
}
}并将此代码添加到RealmConfiguration构建器中:
RealmConfiguration.Builder()
//...
.migration(new CustomRealmMigration())
//...
.build()发布于 2019-04-09 01:11:46
您可以通过DynamicRealm.getInstance(realmConfiguration)打开领域以查看模式版本。如果它小于6,则关闭动态领域,然后调用Realm.deleteRealm(realmConfiguration)。
https://stackoverflow.com/questions/55459436
复制相似问题