Схема перенесена в Realm, хотя версия схемы никогда не менялась

При обновлении схемы моей области я перенастроил RealmMigration, чтобы добавить новый класс / поля, однако я забыл обновить версию схемы. Когда я обновил приложение, у меня не было проблем, но потом я понял, что забыл обновить версию схемы, что сбивало с толку, потому что теперь я понял, что область обновила мою схему, а я не указал, что версия изменилась.

Поэтому, когда я обновил его, я получил исключение класса уже существует, что было еще более запутанным, потому что теперь я не знал, что установить мою версию схемы - я изменил схему, но изменения уже были внесены объектом RealmMigration, поэтому я не знал, должен ли я оставить его со старым номером версии, в результате чего исключение класса уже не существует, или изменить его на правильный номер версии, вызывая исключение.

Возможно ли, что область может выполнить миграцию с заданным объектом RealmMigration, если возникнет исключительная ситуация миграции области; даже если версия схемы никогда не обновлялась?


person shoe    schedule 13.12.2016    source источник


Ответы (2)


Допустим, ваш код миграции:

RealmMigration migration = new RealmMigration() {
    @Override
    public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
        RealmSchema schema = realm.getSchema();
        if (oldVersion == 0) {
            schema.create("Person")
               .addField("name", String.class)
               .addField("age", int.class);
            // forgot: oldVersion++;
        }
    }
}

Вы не можете использовать версию, чтобы определить, следует ли вам добавить класс Person или поднять версию. Но вы можете использовать то, что вы знаете, если Person существует, вам нужно будет поднять версию.

RealmMigration migration = new RealmMigration() {
    @Override
    public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
        RealmSchema schema = realm.getSchema();
        if (oldVersion == 0) {
            if (schema.contains("Person)) {
                oldVersion++;
            } else {
                schema.create("Person")
                   .addField("name", String.class)
                   .addField("age", int.class);
                oldVersion++;
            }
        }
    }
}
person geisshirt    schedule 14.12.2016
comment
предназначена ли область для обновления схемы, даже если версия схемы не была изменена? - person shoe; 14.12.2016
comment
Не предназначен для этого. Мы никогда не рассматривали это как вариант использования. - person geisshirt; 15.12.2016

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

person XIII-th    schedule 29.12.2016