从多个版本

时间:2018-01-15 03:17:17

标签: realm swift4

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升级,那么此错误将不会发生。

1 个答案:

答案 0 :(得分:1)

update2to3无法在address上创建oldObject(并且无法执行此操作)。直接从版本2升级到4时,update2to3update3to4都会获得版本2 oldObject和版本4 newObject s。

对于您问题中显示的迁移,最简单的解决方法是完全删除迁移功能,因为它们只是重复添加新属性时Realm自动执行的操作。