2017-09-28 3 views
0

J'essaie d'interroger plusieurs champs en même temps qui contient une liste de valeurs de chaînes dans Realm. Disons que j'ai l'objet suivant:Est-il possible d'interroger plusieurs champs contenant une liste de valeurs de chaîne (Realm Java)

public class Article extends RealmObject implements Serializable{ 
    @PrimaryKey 
    @Required 
    private String aID = UUID.randomUUID().toString(); 

    private String title; 
    private String description; 
    private String authors; 
    private RealmList<Tag> tags; 
} 

Je voudrais interroger tous les articles que le titre ou la description ou les étiquettes contiennent la liste des chaînes.

Je sais que le prédicat « en » peut être utilisé pour correspondre à une liste de valeurs à un champ comme suit:

realm.where(Article.class).beginGroup().in("title", listOfValues Case.INSENSITIVE).or().in("description", listOfValues, Case.INSENSITIVE).or().in("tags.tag",listOfValues, Case.INSENSITIVE).findAll(); 

Ceci ne retourne « correspondant » valeurs, mais je suis à la recherche des valeurs "contenant". Il y a aussi le prédicat "contains", mais je pense qu'il ne peut être comparé qu'à une seule valeur.

Y a-t-il un moyen de le faire?

+1

Je pense que vous devez itérer et utiliser 'contains' – EpicPandaForce

+0

@EpicPandaForce Yeap, je pensais le faire. Avez-vous l'intention d'inclure quelque chose de similaire dans l'arriéré? Je vais poster la solution en attendant. Merci – user274051

Répondre

1

Une solution pour résoudre cette question est que @EpicPandaForce a suggéré dans son commentaire, itérer et utiliser contient. Voici le code pour ce faire:

RealmResults<Article> newResults; 
RealmQuery<Article> where = r.where(Article.class).beginGroup(); 
for (String keyword : keywords) { 
    where = where.contains("name", keyword, Case.INSENSITIVE) 
      .or() 
      .contains("description", keyword, Case.INSENSITIVE) 
      .or() 
      .equalTo("tags.tag", keyword, Case.INSENSITIVE); 
} 

newResults = where.endGroup().findAll();