2015-08-17 18 views
7

Używam Realm dla Swift 1.2 i zastanawiam się, jak zaimplementować złożony klucz podstawowy dla jednostki.Realm.io i złożone klucze podstawowe

Więc podasz swój podstawowy klucz nadrzędnymi primaryKey()

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

Jedynym sposobem, widzę, jest stworzenie kolejnego atrybutu związek jak tak

var key1 = "unique thing" 
var key2 = 123012 

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

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

Jak prawidłowo dostarczyć klucze złożone w Realm ?

Odpowiedz

9

Wygląda na to, że jest to właściwy sposób zwracania klucza złożonego w obszarze.

Oto odpowiedź od Realm: https://github.com/realm/realm-cocoa/issues/1192

Można stosować mieszankę leniwy i didSet zamiast mieć właściwość compoundKey być zarówno uzyskane i przechowywane:

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

Od jpsim na realm github: „Realm nie będzie faktycznie nazwać willSet i didSet raz te obiekty są zachowywane, więc będziesz musiał użyć niestandardowych ustawiające” – Roee84

3

Poprawna odpowiedź wymaga aktualizacji (w odniesieniu do didSet i leniwego)

Zaczerpnięte z "mrackwitz" w 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)" 
    } 
} 
Powiązane problemy