【问题标题】:Realm migrated schema even though the schema version was never changed即使架构版本从未更改过,领域也会迁移架构
【发布时间】:2016-12-13 22:02:55
【问题描述】:
更新我的领域架构时,我重新配置了 RealmMigration 以添加新的类/字段,但是我忘记更新架构版本。当我更新应用程序时,我没有遇到任何问题,但后来意识到我忘记更新架构版本,这令人困惑,因为我现在意识到领域更新了我的架构,而我没有指定版本已更改。
所以当我更新它时,我得到了类已经存在的异常,这更加令人困惑,因为现在我也不知道要设置我的架构版本——我更改了架构,但更改已经由RealmMigration对象,所以不知道是不是应该把它留在旧版本号,导致没有类已经存在异常,或者将它更改为正确的版本号,导致异常。
如果遇到领域迁移异常,领域是否可以使用给定的RealmMigration 对象执行迁移;即使架构版本从未更新过?
【问题讨论】:
标签:
realm
realm-migration
【解决方案1】:
假设您的迁移代码是:
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++;
}
}
}
}
【解决方案2】:
如果您忘记更改数据库版本,领域迁移将不会启动并且不会损坏数据库。只需编写实际版本(即以前的 - 1,实际 - 2),正确的迁移脚本将自动启动。