在RealmConfiguration构建期间获取领域旧模式版本

时间:2019-04-01 16:13:19

标签: android kotlin realm

在我当前的项目中,针对不同的海豚,我们有五个不同的领域实例。现在,主要版本的架构版本为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,则允许我们始终删除领域。

2 个答案:

答案 0 :(得分:0)

您可以使用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()

答案 1 :(得分:0)

您可以通过DynamicRealm.getInstance(realmConfiguration)打开领域以查看架构版本。如果小于6,则关闭动态领域,然后调用Realm.deleteRealm(realmConfiguration)