func runMigration(migration: Migration, olderVersion: UInt64, newVersion: UInt64) {
// upgrade from version 2 to 3
if olderVersion <= 2 && newVersion >= 3 {
update2to3(migration)
}
// upgrade from version 3 to 4
if olderVersion <= 3 && newVersion >= 4 {
update3to4(migration)
}
}
private func update2to3(_ migration: Migration) {
migration.enumerateObjects(ofType: Student.className(), {oldObject, newObject in
newObject?[“address”] = “”
})
}
private func update3to4(_ migration: Migration) {
migration.enumerateObjects(ofType: Student.className(), {oldObject, newObject in
newObject?[“address”] = oldObject?["address"] ?? nil
})
}
示例当前域模式版本为2,用户升级到最新版本4(跳过版本3)。上面将执行update2to3()
此方法将添加在版本3中添加的address
属性。然后将执行将update3to4()
属性迁移到address >可选/可空属性。
有人可以告诉我上述代码有什么问题吗?为什么update3to4()
执行它时崩溃,因为address
属性不存在?当address
创建此属性时,update2to3()
属性如何存在?
这是崩溃错误:
Terminating app due to uncaught exception 'RLMException', reason: 'Invalid property name 'address' for class 'Student'.'
注意: 这仅在用户从2升级到4时发生,但如果用户从2,3升级,那么此错误将不会发生。
答案 0 :(得分:1)
update2to3
无法在address
上创建oldObject
(并且无法执行此操作)。直接从版本2升级到4时,update2to3
和update3to4
都会获得版本2 oldObject
和版本4 newObject
s。
对于您问题中显示的迁移,最简单的解决方法是完全删除迁移功能,因为它们只是重复添加新属性时Realm自动执行的操作。