Можно ли запросить несколько полей, содержащих список строковых значений (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();

Это вернет только значения "соответствующие", но я ищу значения "содержащие". Есть еще предикат "содержит", но я думаю, что его можно сравнить только с одним значением.

Есть какой-либо способ сделать это?


person user274051    schedule 28.09.2017    source источник
comment
Я думаю, вам нужно повторить и использовать contains   -  person EpicPandaForce    schedule 28.09.2017
comment
@EpicPandaForce Да, я думал об этом. Планируете ли вы включить что-то подобное в бэклог? Я тем временем опубликую решение. Спасибо   -  person user274051    schedule 29.09.2017
comment
Отредактировал вопрос, чтобы убрать бесполезный .beginGroup   -  person Maelig    schedule 02.08.2018


Ответы (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();
person user274051    schedule 29.09.2017
comment
.beginGroup() и .endGroup() здесь бесполезны, потому что нет других групп или внешних критериев - person Maelig; 02.08.2018

Более простой ответ - напрямую использовать .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);
person Maelig    schedule 02.08.2018
comment
В коде Realm-Java вы можете найти 2 метода, потому что их всего два, можете ли вы сослаться на метод contains(String fieldName, List<String> listOfValues)? Во всяком случае, я не думаю, что существует такой метод. - person Farid; 24.12.2019
comment
может они изменили API после моего ответа? Я больше не использую Realm (потому что больше не работаю над тем проектом, к которому привык) - person Maelig; 30.12.2019