2016-03-22 10 views
1

Realm Demo-Datenbank enthält Beispielobjekte mit inverse Verbindung: ObjectReference hat eine Verknüpfung zu RealmTestClass1.Was ist der richtige Code für Realm inverse Verbindung?

class RealmTestClass1: Object { 
    dynamic var integerValue = 0 
    let arrayReference = List<RealmTestClass0>() 
} 

class RealmTestClass2: Object { 
    dynamic var boolValue = false 
    dynamic var objectReference: RealmTestClass1? 
} 

Wie die gleiche Struktur neu erstellen? Welcher Code wird für die objectReference-Eigenschaft benötigt, um dieselbe Verknüpfung zur übergeordneten Objekteigenschaft zu erstellen?

Antwort

0

Links in Realm sind unidirektional. Wenn also eine to-many-Eigenschaft von Person.dogs mit einer Dog-Instanz verknüpft ist und eine to-one-Eigenschaft von Dog.owner mit Person verknüpft ist, sind diese Links unabhängig voneinander. Durch das Anhängen eines Hundes an das Hundeeigentum einer Personeninstanz wird die Eigentümereigenschaft des Hundes nicht automatisch auf diese Person festgelegt. Da das manuelle Synchronisieren von Beziehungspaaren fehleranfällige, komplexe und duplizierte Informationen ist, macht Realm eine API verfügbar, um die unten beschriebenen Backlinks abzurufen.

Mit inversen Beziehungen können Sie alle Objekte erhalten, die mit einem bestimmten Objekt über eine bestimmte Eigenschaft verknüpft sind. Wenn Sie beispielsweise Object.linkingObjects(_:forProperty:) für eine Dog-Instanz aufrufen, werden alle Objekte der angegebenen Klasse zurückgegeben, die mit der angegebenen Eigenschaft eine Verbindung zur aufrufenden Instanz herstellen. Es ist möglich, dieses Muster zu vereinfachen, indem ein read-only (berechnete) Besitzer Eigenschaft auf Hunde definieren:

class Person: Object { 
    // ... other property declarations 
    let dogs = List<Dog>() 
} 

class Dog: Object { 
    dynamic var name = "" 
    dynamic var age = 0 
    var owners: [Person] { 
     // Realm doesn't persist this property because it only has a getter defined 
     // Define "owners" as the inverse relationship to Person.dogs 
     return linkingObjects(Person.self, forProperty: "dogs") 
    } 
} 

Dieses von Realm's docs on relationships genommen wurde, die ich Sie ermutigen, zu lesen.

+0

Vielen Dank für die Antwort. Ich lese die Dokumente über Realm. Manchmal macht das Lesen es jedoch nicht klarer. Der von Ihnen zitierte Code fügt keine neue Spalte mit dem Link zur Person hinzu, wie es in der Demo-Datenbank der Fall ist. – alexey

+0

Ich nehme an, ich verstehe deine Frage nicht wirklich. "Wie erstelle ich dieselbe Struktur?" Der Code, den du gepostet hast, scheint die Struktur zu haben, die du beschreibst, oder? Wie unterscheidet es sich von dem, was Sie erreichen möchten? "Welcher Code wird für die objectReference-Eigenschaft benötigt, um dieselbe Verknüpfung zur übergeordneten Objekteigenschaft zu erstellen?" Zwei separate Link-Eigenschaften können nicht den gleichen Link teilen, das meine ich mit "Links sind unidirektional". Wenn Sie nur einen * Link setzen möchten, sollten Sie 'linkingObjects (_: forProperty:)' verwenden, wie in meiner obigen Antwort geschrieben. – jpsim

+0

Es tut mir leid, wenn meine Frage nicht klar genug war. Lass mich noch einmal versuchen. siehe [Screenshot] (https://s13.postimg.org/5bkv8zunr111.jpg). Ich versuche, die gleiche Verbindung Verbindung zu erreichen, wie es in Realm Demo-Datenbank. – alexey

Verwandte Themen