领域迁移了架构,即使架构版本从未更改过

Realm migrated schema even though the schema version was never changed

更新我的领域模式时,我重新配置了 RealmMigration 以添加新的 class/fields ,但是我忘记更新模式版本。当我更新应用程序时,我没有遇到任何问题,但后来意识到我忘记更新架构版本,这很令人困惑,因为我现在意识到领域更新了我的架构而没有我指定版本已更改。

所以当我更新它时,我得到了 class 已经存在的异常,这更加令人困惑,因为现在我也不知道如何设置我的模式版本——我改变了模式,但是RealmMigration 对象已经进行了更改,所以我不知道是否应该将其保留在旧版本号,导致没有 class 已经存在异常,或者将其更改为正确的版本号,导致异常。

如果遇到领域迁移异常,领域是否可以使用给定的 RealmMigration 对象执行迁移?即使模式版本从未更新过?

假设您的迁移代码是:

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 class 或修改版本。但是你可以使用你知道 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++;
            }
        }
    }
}

如果您忘记更改数据库版本,领域迁移将不会启动并且不会损坏数据库。只需编写实际版本(即以前的 - 1,实际的 - 2),适当的迁移脚本将自动启动。