Realm迅速改变了primaryKey

时间:2016-08-08 14:05:21

标签: ios swift migration realm

所以我有Realm对象

class RegistrationPlateDB: RLMObject {

    dynamic var registrationPlate : String = ""
    dynamic var user : String = ""

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

并希望将其更改为

class RegistrationPlateDB: Object {

    dynamic var plateID : Int = -1
    dynamic var registrationPlate : String = ""
    dynamic var name : String = ""
    dynamic var user : String = ""


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

所以我写了一篇文章

 migration.enumerate(RegistrationPlateDB.className()) { oldObject, newObject in

        newObject!["name"] = ""
        newObject!["user"] = ""
        newObject!["registrationPlate"] = ""
        newObject!["plateID"] = -1
        newObject!["primaryKeyProperty"] = "plateID";  
 }

但是我得到一个错误可能是因为更改了primaryKey,因为如果我将该行删除它可以工作,但主键不会改变。

有人可以告诉我如何更改primaryKey。

编辑:第一个对象是为Objective-c领域编写的

EDIT2:或者,如果有人知道我怎么能做出plateID自动增量

1 个答案:

答案 0 :(得分:4)

来自Realm的Katsumi。您无需在迁移块中尝试更改主键。

我们总是自动将架构更新到最新版本,并且您必须在迁移块中处理的唯一事情就是调整数据以适应它(例如,如果重命名属性,则必须从旧版本复制数据属性到迁移块中的新属性)。

因此不需要newObject!["primaryKeyProperty"] = "plateID";

我认为您的迁移块应如下所示:

migration.enumerate(RegistrationPlateDB.className()) { oldObject, newObject in
    newObject!["user"] = oldObject!["user"]
    newObject!["registrationPlate"] = oldObject!["registrationPlate"]
    newObject!["plateID"] = Int(oldObject!["registrationPlate"] as! String)
}

如果您想将序号分配给plateID,例如:

var plateID = 0
migration.enumerate(RegistrationPlateDB.className()) { oldObject, newObject in
    newObject!["user"] = oldObject!["user"]
    newObject!["plateID"] = plateID
    plateID += 1
}