2017-08-17 2 views
0

Mit Realm habe ich 2 Setup-Objekte: User und Question.Filterbereich auf Pivot-Tabellen-Beziehung

Jeder Nutzer beantwortet eine Frage, das ist wie so in einem dritten Objekt gespeichert ist:

class Answer : Object { 
    dynamic var user: User? 
    dynamic var question: Question? 
    dynamic var answerText = "" 
} 

Was ich tun muß, ein Benutzerobjekt gegeben ist und eine Frage-Objekt, das zugehörige Antwort Objekt erhalten. In semi-SQL Pseudo-Code so etwas wie:

SELECT FROM Answers WHERE user = User and question = Question 

 

So ... Wie erreiche ich das?

 


 

Bonuspunkte, wenn es eine Möglichkeit nicht aufweist, ist die Frage Objekt zu holen und stattdessen den Primärschlüssel des Objekts verwenden (i das Benutzerobjekt, aber nur eine Frage ID, so muss ich das Frageobjekt zuerst auflösen), so etwas wie:

Auch weil Realm lädt nicht das gesamte Objekt in den Speicher, bis Sie es brauchen, ich glaube nicht, dass es dazu in der Lage ist.

Hinweis: Ich habe durch Problem ein wenig vereinfacht. Es gibt einen guten Grund, warum ich keine primäre Antwort-ID habe, also bitte sag mir nicht, dass ich eine hinzufügen soll.

Antwort

3

Sie müssen Ihr User Modell ändern, um eine inverse Beziehung mit Answer aufzunehmen. Dies schließt automatisch alle Antworten ein, wobei user dem aktuellen Benutzer entspricht.

Dann müssen Sie die Benutzer abfragen, auf ihre answers-Eigenschaft zugreifen und diese basierend auf den Fragen filtern.

Ich habe diese Skelettklassen erstellt, so dass ich die Abfrage testen können, ich weiß, dass Ihre User und Question Klasse unterschiedlich sein könnten, so die primaryKey ändern und Frage Filter Ihre genaue Klassendefinition anzupassen.

class User: Object { 
    let answers = LinkingObjects(fromType: Answer.self, property: "user") 
    dynamic var userName = "" 
    override class func primaryKey()->String { 
     return "userName" 
    } 
} 

class Answer : Object { 
    dynamic var user: User? 
    dynamic var question: Question? 
    dynamic var answerText = "" 
} 

class Question: Object { 
    dynamic var title = "" 
} 

let questionId = "" 
let questions = realm.object(ofType: User.self, forPrimaryKey: "userName")?.answers.filter("question.id = %@",questionId) 
+1

Dank Dávid, ich war nicht bewusst, ich auf ähnlichen Eigenschaften wie 'user.id' filtern könnte so leicht !, Ihre Antwort mich dazu gebracht, einen Test-App zu erstellen, und ich fand ich kann' realm.objects tun (Answer.self) .filter ("user.id =% @ AND question.id =% @", 1, 7) '. Danke für Ihre Hilfe – TRG