Можно ли запросить несколько полей, содержащих список строковых значений (Realm Java)
Я пытаюсь запросить несколько полей одновременно, который содержит список строковых значений в 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();
Это будет возвращать только "совпадающие" значения, но я ищу "содержащие" значения. Существует также предикат "содержит", но я думаю, что его можно сравнить только с одним значением.
Есть какой-либо способ сделать это?
2 ответа
Обходной путь для решения этого вопроса, как предложила @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();
Более простой ответ - использовать напрямую .contains
(к сожалению, это не объясняется в царстве 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);