2015-08-18 4 views
7

Ich verwende Realm, um meine Daten auf Android zu speichern. Super Rahmen! Jetzt das einzige Problem, das ich jetzt habe, ist:Realm-Abfrage mit Liste

Ich habe eine Array-Liste Strings mit IDs von Ländern in meiner Datenbank.

Jetzt ich meine Getränke abrufen, die eine Beziehung zu Ländern enthält.

Gibt es eine Möglichkeit, dass ich eine Abfrage wie dies zu tun könnte:

String [] ids; 

realm.where(Drinks.class).equalsTo("country.id", ids); 

So etwas wie das?

Oder muss ich wirklich eine Abfrage machen, um mir alle Getränke zu bekommen und dann die Liste manuell filtern?

EDIT:

Meine Klassen:

public class Drinks extends RealmObject { 
    @PrimaryKey 
    private String id; 
    private String name; 
    private Country country; 
} 

public class Country extends RealmObject { 
    @PrimaryKey 
    private String id; 
    private String name; 
} 
+0

ich brauchen würde, Ihre Getränke Klasse und dein Land-Klasse zu sehen, Ihnen zu sagen, die Antwort abzurufen. – EpicPandaForce

+0

meine Frage bearbeitet :-) – user1007522

+0

In diesem Fall, ja, würde die hypothetische Abfrage, die Sie erwähnt haben, in der Tat funktionieren, wird es im Abschnitt "LINK QUERIES" der Dokumentation beschrieben. https://realm.io/docs/java/latest/#link-queries obwohl ich persönlich finde, dass Link-Anfragen irgendwie langsam sind, wenn ich das "Land" in Realm einstelle, setze ich auch ein Feld namens "countryId", damit ich brauche keine Linkabfragen - aber das bin nur ich. – EpicPandaForce

Antwort

5

Was möchten Sie mit Link-Abfragen in der Theorie möglich ist, tun (für "country.id" Suche), jedoch sind Link-Abfragen langsam. Außerdem müssten Sie eine Reihe von or() Prädikaten miteinander verketten, und das würde ich bei einer Linkabfrage nicht riskieren.

Ich würde empfehlen, die folgende

public class Drinks extends RealmObject { 
    @PrimaryKey 
    private String id; 
    private String name; 
    private Country country; 
    @Index 
    private String countryId; 
} 

public class Country extends RealmObject { 
    @PrimaryKey 
    private String id; 
    private String name; 
} 

mit Und wenn Sie die Country in Ihrer Klasse gesetzt, Sie setzen auch die countryId als country.getId().

Sobald Sie das tun, können Sie so konstruieren:

RealmQuery<Drinks> drinkQuery = realm.where(Drinks.class); 
int i = 0; 
for(String id : ids) { 
    if(i != 0) { 
     drinkQuery = drinkQuery.or(); 
    } 
    drinkQuery = drinkQuery.equalTo("countryId", id); 
    i++; 
} 
return drinkQuery.findAll(); 
+1

Danke :-) das geht gut! – user1007522

+0

Der Mangel an grundlegenden Dingen wie einem IN-Operator, ist äußerst bedenklich und unbequem. – RunLoop

+0

@RunLoop ehrlich, Sie können einen IN-Operator mit kaum 5 Zeilen machen. Wenn Sie etwas pingelig machen wollen, sprechen Sie über den Mangel an primitiven Reichslisten. – EpicPandaForce

3

Da die Realm-Datenbank RealmQuery.in() mit der Version hinzugefügt 1.2.0

ich so etwas wie dies unter Verwendung empfehlen.

//Drinks 
public class Drinks extends RealmObject { 
@PrimaryKey 
private String id; 
private String name; 
private String countryId; 

//getter and setter methods 
} 

//Country 
public class Country extends RealmObject { 
    @PrimaryKey 
    private String id; 
    private String name; 

//getter and setter methods 
} 

Der Code in Aktivität verwenden/Fragmente Getränkeliste

String[] countryIdArray = new String[] {"1","2","3"} //your string array 
RealmQuery<Drinks> realmQuery = realm.where(Drinks.class) 
      .in("countryId",countryIdArray); 
RealmResults<Drinks> drinkList = realmQuery.findAll();