2015-08-17 29 views
7

Sto utilizzando Realm per Swift 1.2 e mi sto chiedendo come implementare una chiave primaria composta per un'entità.Realm.io e tasti primari composti

Quindi si specifica la chiave primaria sovrascrivendo primaryKey()

override static func primaryKey() -> String? { // <--- only 1 field 
    return "id" 
} 

L'unico modo che posso vedere è quello di creare un altro attributo composto in questo modo

var key1 = "unique thing" 
var key2 = 123012 

lazy var key: String? = { 
    return "\(self.key1)\(self.key2)" 
}() 

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

Come si fa a fornire correttamente le chiavi composte in Realm ?

risposta

9

Sembra che sia il modo corretto per restituire una chiave composta in Realm.

Ecco la risposta dal regno: https://github.com/realm/realm-cocoa/issues/1192

Si potrebbe utilizzare un mix di pigro e didSet invece di avere la proprietà compoundKey essere sia derivato e memorizzati:

public final class Card: Object { 
    public dynamic var id = 0 { 
     didSet { 
      compoundKey = compoundKeyValue() 
     } 
    } 
    public dynamic var type = "" { 
     didSet { 
      compoundKey = compoundKeyValue() 
     } 
    } 
    public dynamic lazy var compoundKey: String = self.compoundKeyValue() 
    public override static func primaryKey() -> String? { 
     return "compoundKey" 
    } 

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

// Example 

let card = Card() 
card.id = 42 
card.type = "yolo" 
card.compoundKey // => "42-yolo" 
+0

Da jpsim al regno github: "Realm non sarà effettivamente chiamare willSet e didSet una volta che tali oggetti sono persistenti, quindi dovrete usare setter personalizzati" – Roee84

3

la correttezza risposta ha bisogno di un aggiornamento (per quanto riguarda setet e pigro)

Tratto da "mrackwitz" su Realm git-hub: https://github.com/realm/realm-cocoa/issues/1192:

public final class Card: Object { 
    public dynamic var id = 0 
    public func setCompoundID(id: Int) { 
     self.id = id 
     compoundKey = compoundKeyValue() 
    } 
    public dynamic var type = "" 
    public func setCompoundType(type: String) { 
     self.type = type 
     compoundKey = compoundKeyValue() 
    } 
    public dynamic var compoundKey: String = "0-" 
    public override static func primaryKey() -> String? { 
     return "compoundKey" 
    } 

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