2016-06-03 10 views
2

Ist es in Realm möglich, die umgekehrte Beziehung einer Eins-zu-Eins-Beziehung zu erhalten?Wie kann man eine inverse Beziehung einer Eins-zu-Eins-Beziehung mithilfe von Realm ermitteln?

Zum Beispiel:

class Dog: Object { 
     dynamic var name: String? 
     dynamic var owner: Person? 
    } 

    class Person: Object { 
     dynamic var name: String? 
     let dog = LinkingObjects(fromType: Dog.self, property: "owner").first 
    } 



    let person = Person() 
    person.name = "Harry" 
    try! realm.write { 
     realm.add(person) 
    } 


    let dog = Dog() 
    dog.name = "Fido" 
    dog.owner = person 
    try! realm.write { 
     realm.add(dog) 
    } 


    print(person.dog?.name) // -> result is nil 

Und auch:

let arbitraryPerson = realm.objects(Person).filter("name contains 'Harry'").first! 
    let dogOwned = arbitraryPerson.dog 

    print(dogOwned?.name) // -> result is nil 

Es scheint, dass ownedDog immer nil ist. Warum konnte die inverse Beziehung nicht bestimmt werden? Oder sollte dog immer von list<T> Typ sein (d. H. Zu-viele-Beziehung), um eine Beziehung zwischen diesen Objekten zu erzwingen? In dieser Situation funktioniert es, aber es fühlt sich nicht richtig an, eine zu-viele-Beziehung zu erzwingen, wenn das nicht der Fall ist.

Antwort

4

Das LinkingObjects Objekt verfügt über eine Eigenschaft des Modellobjekts für Realm sein, zu wissen, was das Objekt geht es mit:

class Person: Object { 
    dynamic var name: String? 
    let _dogs = LinkingObjects(fromType: Dog.self, property: "owner") 
    var dog: Dog? { return _dogs.first } 
} 
+0

Dies ist eine sehr nützliche Lösung für mein Problem! – Gerard

1

Soweit ich es verstehe, sind Relationen in Realm standardmäßig nicht bidirektional, wie Sie es von Core Data gewohnt sind. Wenn Sie möchten, dass beide Objekte die Beziehung kennen, müssen Sie sie in beide Richtungen setzen;

dog.owner = person 
person.ownedDog = dog 
+0

, die eine Menge und es funktioniert in der Tat erklärt! Es ist jedoch schade, dass diese inverse Beziehungen nicht automatisch erstellt werden. Es ist auch ein Nachteil, dass ein Primärschlüssel benötigt wird, um das andere Objekt zu aktualisieren. Hoffentlich wird dies in einer zukünftigen Version verbessert werden. – Gerard

+1

Ich bin froh, dass ich helfen konnte! Es ist wahrscheinlich nicht auf der Straßenkarte, um Reverse-Beziehungen automatisch zu implementieren. Während Core Data hauptsächlich dazu dient, persistente Daten zu speichern und Entscheidungen für Sie treffen, sind die Ziele von Realm viel besser als eine richtige Datenbank. Und Datenbanken haben oft keine automatische Bidirektionalität aus allen möglichen Gründen. – SpacyRicochet

Verwandte Themen