5

我正在尝试同时查询多个字段,其中包含 Realm 中的字符串值列表。可以说我有以下对象:

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

我想查询所有文章的标题、描述或标签包含哪些字符串列表。

我知道谓词“ in ”可用于将值列表与字段匹配,如下所示:

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

这只会返回“匹配”值,但我正在寻找“包含”值。还有“包含”谓词,但我认为它只能与一个值进行比较。

有没有办法做到这一点?

4

2 回答 2

8

正如@EpicPandaForce 在他的评论中建议的那样,解决这个问题的解决方法是迭代并使用包含。这是执行此操作的代码:

 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();
于 2017-09-29T07:56:37.340 回答
0

一个更简单的答案是直接使用.contains(遗憾的是在 realm-java 文档中没有解释)。

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

从 Realm-Java 代码中,您可以找到 2 种方法:

public RealmQuery<E> contains(String fieldName, String value);
public RealmQuery<E> contains(String fieldName, String value, Case casing);
于 2018-08-02T13:03:49.330 回答