2015-07-07 21 views
18

Ich bin neu in Swift und Realm. Ich möchte einen zusammengesetzten Primärschlüssel machen und, wenn ich so etwas wie dies versuche ich:Composite Primärschlüssel Realm/Swift

class DbLocation : Object { 
dynamic var id = 0 
dynamic var tourId = 0 

dynamic var uuid : String { 
    return "\(id)\(tourId)" 
} 

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

Ich erhalte diese Fehlermeldung: ‚Primärschlüssel Eigenschaft‚UUID‘existiert nicht auf Objekt‚DbLocation‘

Jeder kann mir mit einem Beispiel helfen, wie man einen zusammengesetzten Primärschlüssel erstellt?

Antwort

21

Dies sollte man in Modell ist die Antwort geben:

class DbLocation: Object { 
    dynamic var id = 0 
    dynamic var tourId = 0 

    func setCompoundID(id: Int) { 
     self.id = id 
     compoundKey = compoundKeyValue() 
    } 

    func setCompoundTourId(tourId: Int) { 
     self.tourId = tourId 
     compoundKey = compoundKeyValue() 
    } 

    dynamic lazy var compoundKey: String = self.compoundKeyValue() 

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

    func compoundKeyValue() -> String { 
     return "\(id)\(tourId)" 
    } 
} 

Die benutzerdefinierten Setter stellen sicher, dass der compoundKey immer aktualisiert wird Das Lazy-Key-Wort stellt sicher, dass es beim ersten Zugriff von dem abgeleitet wird, was Sie bereits festgelegt haben.

Erfahren Sie mehr zu diesem Thema in this thread, wo dieses Problem diskutiert wurde.

+0

, wenn wir zusammengesetzte Schlüsselvariable wie folgt erklären: dynamisch faul var fullname: String = „\ (self.id) - \ (self.tourId) "Was ist dann das Problem? Vielen Dank im Voraus –

+0

Swift faule Eigenschaften sind explizit verboten, es sei denn, sie werden ignoriert. Wie lösen wir dieses Problem jetzt @Michal? – amagain

+2

Ich habe die App "App beenden" aufgrund der nicht abgefangenen Ausnahme "RLMException" erhalten, Grund: "Lazy verwaltete Eigenschaft" compoundKey "ist in einer Realm Swift-Objektklasse nicht erlaubt. Fügen Sie die Eigenschaft entweder der Liste der ignorierten Eigenschaften hinzu oder machen Sie sie nicht faul. ' –

-4

Sie eine Eigenschaft zurückzukehren benötigt von Ihrem Objekt

hier ist Beispielcode

class FoodModel:Object 
{ 
    dynamic var name = "" 
    dynamic var _id = "" 


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

Beachten Sie, dass _id var

+4

Nun, ich frage über Composite Primärschlüssel .. – halfred

+1

Dies ist kein zusammengesetzter Schlüssel – styler1972

1

Erstellen Sie einfach eine neue Eigenschaft, deren Wert auf andere Eigenschaften festgelegt wird, von denen Sie erwarten, dass sie zusammengesetzte Primärschlüssel sind.

class DbLocation: Object { 
      dynamic var id = 0 
      dynamic var tourId = 0 
      dynamic var compoundKey: String? = "" 

     override static func primaryKey() -> String? { 
       return "compoundKey" 
      } 
     } 
    let location = DbLocation() 
    location.tourId = 1 
    location.id = 5 
    location.compoundKey = "\(id) \(tourId)" 
+0

Entschuldigung Bud entfernen, aber wir kennen bereits Workarounds (wie in Ihrer Antwort), aber die Diskussion über native Unterstützung von Verbindung Keys gibt es seit einiger Zeit und das Problem wird hier verfolgt: https://github.com/realm/realm-cocoa/issues/3453 – halfred

Verwandte Themen