领域快速更改primaryKey

sch*_*mru 2 migration realm ios swift

所以我有Realm对象

class RegistrationPlateDB: RLMObject {

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

    override static func primaryKey() -> String? {
        return "registrationPlate"
    } ...
Run Code Online (Sandbox Code Playgroud)

并希望将其更改为

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"
    } ....
Run Code Online (Sandbox Code Playgroud)

所以我写了一个迁移

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

        newObject!["name"] = ""
        newObject!["user"] = ""
        newObject!["registrationPlate"] = ""
        newObject!["plateID"] = -1
        newObject!["primaryKeyProperty"] = "plateID";  
 }
Run Code Online (Sandbox Code Playgroud)

但是我可能会因为primaryKey更改而收到错误消息,因为如果我将该行留在外面,它会起作用,但是主键不会更改。

有人可以告诉我如何更改primaryKey的任何想法。

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

EDIT2:还是有人知道我如何使PlateID自动递增

kis*_*umi 5

来自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)
}
Run Code Online (Sandbox Code Playgroud)

如果您想为分配序列号plateID,例如:

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