Realm query with List

In latest version of Realm 7+, you can use anyOf to match a field against a list of values.

anyOf("name", new String[]{"Jill", "William", "Trillian"})

in older versions, use in instead of anyOf and with kotlin use oneOf instead of in.

see this issue


What you want to do is possible with link queries in theory (searching for "country.id"), however link queries are slow. Also you'd need to concatenate a bunch of or() predicates together, and I would not risk that with a link query.

I would recommend using the following

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;
}

And when you set the Country in your class, you also set the countryId as country.getId().

Once you do that, you can construct such:

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();

Since the Realm database has added RealmQuery.in() with the version 1.2.0

I suggest using something like this.

//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
}

The code to use inside activity/fragments to retrieve drink list

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();

Tags:

Android

Realm