2016-08-08 40 views
1

So habe ich Realm ObjektRealm rasche Änderung primaryKey

class RegistrationPlateDB: RLMObject { 

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

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

und möchte es ändern

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" 
    } .... 

So habe ich eine Migration geschrieben

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

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

aber ich ein Fehler wahrscheinlich wegen des primaryKey-Wechsels, denn wenn ich diese Zeile verlasse, funktioniert es, aber der Primärschlüssel ändert sich nicht.

Kann jemand mir eine Idee geben, wie man den primaryKey ändert.

EDIT: Das erste Objekt wurde für Objective-c Reich geschrieben

EDIT2: Oder wenn jemand weiß, wie könnte ich plateID autoincrement hier

Antwort

3

Katsumi von Reich zu machen. Sie müssen nicht versuchen, den Primärschlüssel im Migrationsblock zu ändern.

Wir aktualisieren das Schema immer automatisch auf die neueste Version, und das einzige, was Sie im Migrationsblock behandeln müssen, ist die Anpassung Ihrer Daten (z. B. wenn Sie eine Eigenschaft umbenennen, aus der Sie die Daten kopieren müssen) alte Eigenschaft auf die neue im Migrationsblock).

So newObject!["primaryKeyProperty"] = "plateID"; wird nicht benötigt.

denke ich, Migration Block wie das sein sollte folgende:

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

Wenn Sie Sequenznummern plateID zuweisen möchten, zum Beispiel:

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

verstand ich die Idee nicht brauchen Ich habe meinen Vorschlag ausprobiert, aber ich denke, das Problem ist jetzt, dass OldObject! ["registrationPlate"] ein Wort ist, also glaube ich nicht, dass das durchkommen könnte. Also, wenn Sie mir sagen könnten, ob es eine Möglichkeit gibt, plateID als Autoincrement bei der Migration zu setzen? – schmru

+0

EDIT: Oder wenn es eine Möglichkeit gibt, ein Objekt so umzubenennen, dass ich ein neues genauso wie das alte erstellen konnte, dann erstelle ich ein altes und kopiere Daten neu. – schmru

+1

@schmru Ich habe die Antwort aktualisiert. Realm unterstützt keine Autoinkrementierungsfunktion. Sie sollten dieses Feature also selbst implementieren. Wenn Sie keine Seriennummer benötigen, ist die Verwendung von 'NSUUID' der einfachste Weg. Wenn Sie mit dem Primärschlüssel sortieren möchten, können Sie statt dessen 'NSDate()' verwenden. –