Получить старую версию схемы во время сборки RealmConfiguration - PullRequest
1 голос
/ 01 апреля 2019

В моем текущем проекте у нас есть пять разных экземпляров царства для разных морских свиней. Основной версии схемы теперь 5, и мы хотим избавиться от нее и запустить следующую (схему версии 6) полностью чистой, потому что мы запустили версию 2.0.0 приложения и произошли изменения в мэрии БД.

Вопрос в том, есть ли способ проверить старую версию схемы экземпляра области перед созданием его новой конфигурации?

Мы уже пытались определить конкретную версию схемы для удаления области с помощью realmDeleteIfMigrationNeeded() и предоставить класс миграции для следующих версий. Проблема с этим подходом заключается в том, что у пользователя есть версия приложения с версией схемы ниже той, которая указана, и обновление до версии приложения с большей, поэтому у нас возникает исключение, необходимое для миграции.

Я также нашел здесь realm, проверьте версию схемы , здесь 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 голосов
/ 08 апреля 2019

Вы можете открыть Царство через DynamicRealm.getInstance(realmConfiguration), чтобы увидеть версию схемы. Если оно меньше 6, закройте динамическое Царство, затем вызовите Realm.deleteRealm(realmConfiguration).

0 голосов
/ 02 апреля 2019

Вы можете использовать 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...