2014-10-01 7 views
27

Ich verwende Realm in einem neuen iOS Swift-Projekt. Ich verwende Xcode 6.0.1 mit iOS SDK 8.0 und Realm 0.85.0So legen Sie den Primärschlüssel in Swift für Realm-Modell fest

Ich versuche, die neue Realm-Primärschlüssel-Funktion zu verwenden, damit ich eine addOrUpdateObject tun kann.

Hier ist ein Beispielmodell:

import Foundation 
import Realm 

class Foo: RLMObject { 
    dynamic var id = 0 
    dynamic var title = "" 

    func primaryKey() -> Int { 
     return id 
    } 
} 

Und wie ich versuche, ein neues Objekt hinzufügen/aktualisieren:

let foo = Foo() 
foo.title = titleField.text 
foo.id = 1 

// Get the default Realm 
let realm = RLMRealm.defaultRealm() 

// Add to the Realm inside a transaction 
realm.beginWriteTransaction() 
realm.addOrUpdateObject(foo) 
realm.commitWriteTransaction() 

ich diesen Fehler:

RLMExecption', reason: ''Foo' does not have a primary key and can not be updated

Hier sind die Dokumente auf dem Primärschlüssel. Ich bin wahrscheinlich Einstellung nicht richtig: http://realm.io/docs/cocoa/0.85.0/api/Classes/RLMObject.html#//api/name/primaryKey

Neuester docs hier ist jetzt: https://realm.io/docs/objc/latest/api/Classes/RLMObject.html#//api/name/primaryKey

+0

Defekten Link zum realm.io doc – styler1972

+0

Wir haben unsere "Kakao" docs verschoben haben, um "objc", wenn wir ins Leben gerufen Realm Swift, so versuchen Sie diesen Link stattdessen: https://realm.io/docs/objc/latest/api/Classes/RLMObject.html#//api/name/primaryKey Wir richten Weiterleitungen von alten Links, so dass dies nicht funktioniert verursacht so viel Verwirrung in der Zukunft. – jpsim

+0

Die Umleitung von den alten Links zu den neuen Dokumenten scheint nicht zu funktionieren, also habe ich meine Frage mit dem neuen Link aktualisiert. – jeffjv

Antwort

64

primaryKey Bedürfnisse eine Klasse-Funktion sein, die den Namen der Eigenschaft gibt, die den Primärschlüssel ist, nicht eine Instanzmethode, die den Wert des Primärschlüssels zurückgibt.

class Foo: RLMObject { 
    dynamic var id = 0 
    dynamic var title = "" 

    override class func primaryKey() -> String? { 
     return "id" 
    } 
} 
+0

Danke, ja das waren meine Probleme. Um es zum Laufen zu bringen, füge ich 'override' hinzu, um die Deklaration zu überschreiben. – jeffjv

+0

Ich habe die Antwort aktualisiert, um das Schlüsselwort "override" aufzunehmen, das für Realm benötigt wird, um die benutzerdefinierte Klassenfunktion korrekt aufzurufen –

+0

Aus irgendeinem Grund bekomme ich eine "ungültige Deklaration von 'primaryKey()'" -Fehler. Kann nicht herausfinden, warum. – Entalpi

6

Der Rückgabetyp primaryKey() ist optional:

class Foo: RLMObject { 
    dynamic var id = 0 
    dynamic var title = "" 

    override class func primaryKey() -> String? { 
     return "id" 
    } 
} 
+0

Vielen Dank für das Hinzufügen, sieht aus wie die angenommene Antwort geändert, um den optionalen Rückgabetyp auch zu reflektieren. –