Ios 使用非规范化数据的领域迁移

Ios 使用非规范化数据的领域迁移,ios,swift,realm,Ios,Swift,Realm,假设您有一个领域对象,如 class Person: Object { var dynamic firstName: String = "" var dynamic lastName: String = "" } 现在,我想升级数据库并将lastName提取到一个新类中,如下所示 class LastName: Object { var dynamic sirName: String = "" override public class func primar

假设您有一个领域对象,如

class Person: Object {
    var dynamic firstName: String = ""
    var dynamic lastName: String = ""
}
现在,我想升级数据库并将lastName提取到一个新类中,如下所示

class LastName: Object {
    var dynamic sirName: String = ""

    override public class func primaryKey() -> String {
        return "sirName"
    }
}

class Person: Object {
    var dynamic firstName: String = ""
    var dynamic lastName: LastName!
}

迁移会是什么样子?我尝试了一个简单的迁移,但这可能会导致多个LastName对象使用相同的primaryKey

在您的
AppDelegate
中,使用选项完成启动:

let configuration = Realm.Configuration(
    schemaVersion: 1, //This must be larger than the previous schemaVersion
    migrationBlock: { migration, oldSchemaVersion in
        if oldSchemaVersion < 1 {
            migration.enumerate(Person.className()) { oldObject, newObject in
                let lastName = oldObject!["lastName"] as! String
                let newValue: [String: String] = ["sirName": lastName]
                let createdObject = migration.create(LastName.className(), value: newValue)
                newObject!["lastName"] = createdObject
            }
        }
})

Realm.Configuration.defaultConfiguration = configuration // Set the new configuration as default

let realm = try! Realm() // Open the default realm to perform the migration

但是,如果存在重复的
lastName
,则此迁移将不起作用,因为
primaryKey
是每个对象的唯一标识符,因此您应该确保永远不会有重复,为
primaryKey
使用另一个属性,或者在
LastName
对象中根本不使用
primaryKey

这不起作用。它正在尝试为新对象设置字典![“姓氏”]property@NoName抱歉,修复了它,它现在可以正常工作了!我相信这仍然可能会给出具有相同primaryKey的重复Lastname对象,从而给出一个errorYes,您是对的。但前提是姓氏有重复的值,我不确定为什么要限制对象对于每个唯一的对象只能有一个值,特别是如果我们实际上谈论的是姓氏。如果你知道你不会有重复的,那么这个方法会起作用。@NoName看到我的扩展答案,它会澄清你关于这个的任何问题。
class Person: Object {
    dynamic var firstName: String = ""
    dynamic var lastName: LastName!
}

class LastName: Object {
    dynamic var sirName: String = ""

    override static func primaryKey() -> String? {
        return "sirName"
    }
}