2015-09-23 3 views
5

Angenommen, die nächste Situation:Realm java Abfragebedingungen

//I don't put the getters and setters, but assume they are there 
public class User extends RealmObject { 
    private RealmList<Dog> dogs; 
} 

public class Dog extends RealmObject { 
    //UPDATE: I've added the variable city, to make my question more exact 
    private String city; 
    private String color; 
    private String name; 
} 

Angenommen: Person 1 hat Hunde: NY-weiß-Joe Person 2 Hunde hat: NY-braun-Mary, SF-weiß-Fluffy, LA-brown-Fluffy Person 3 hat Hunde: NY-braun-Fluffy, LA-weiß-Pepito

Frage: Wie kann ich alle Personen abfragen, die einen braunen Hund namens Fluffy haben?

Was ich habe versucht, die implizit mit AND:

RealmQuery<User> userQuery = realm.where(User.class).equalTo("dogs.color", "brown").equalTo("dogs.name", "Fluffy"); 

Dann habe ich die Dokumentation und die beiden EqualTo lesen() Bedingungen separat ausgewertet werden, das heißt, ich werde:

Alle Benutzer, die einen braunen Hund UND einen Hund haben, der Fluffy genannt wird. (Die Ergebnisse sind also P2, P3).

Wie soll ich diese Abfrage schreiben, um die Bedingungen auf den gleichen Hund anzuwenden?

Antwort

1

Es scheint mir der beste Ansatz, Abfrage nach Primärschlüssel zu verwenden. Ich meine erste Primärschlüssel Dog Klasse hinzufügen:

class Dog extends RealmObject { 
     @PrimaryKey 
     private int id; 
     private String color; 
     private String name; 
} 

Dann erste Schritt Benutzer zu finden, die einen braunen Hund namens Fluffy haben, ist Primärschlüssel eines solchen Hund zu finden. Also machen wir eine Abfrage finden genaue Dog:

Dog dog = realm.where(Dog.class).equalTo("color", "brown").equalTo("name", "Fluffy").findFirst(); 

Danach haben wir uns für die Benutzer suchen, die einen Hund mit definierten Primärschlüssel (ID-Feld):

RealmResults<User> users = realm.where(User.class).equalTo("dogs.id", dog.getId()).findAll(); 
+0

Danke für die Antwort, Sie haben darauf hingewiesen, dass meine Frage nicht exakt war, ich werde meinen Beitrag aktualisieren, bitte überprüfen Sie es erneut. Nochmals vielen Dank und Entschuldigung. – user1915767

1

Die Link-Abfragen in Realm sind Existenzquantifikatoren (https://en.wikipedia.org/wiki/Existential_quantification). Dies bedeutet, dass, wenn eine Bedingung für nur ein Objekt in der Kindklasse erfüllt ist, das Objekt in der Elternklasse zu RealmResults hinzugefügt wird.

Link query example zeigt, wie die Existenzquantifizierer funktionieren werden. Derzeit müssen Sie User s iterieren und die Liste Dogs einzeln abfragen.

Es gibt eine offene issue auf Reverse-Lookups.

+0

Danke Kenneth! – user1915767