Realm на Android - Как выбрать несколько объектов по списку идентификаторов (@PrimaryKey)?

Я создаю приложение Android с базой данных Realm.

У меня есть подкласс RealmObject, называемый Article, который имеет поле id (it и int, а также a @PrimaryKey). Я хотел бы передать в запрос список int (a Set, int[] или что-то еще) из идентификатора статьи и получить только те статьи.

В SQL было бы так:

SELECT *
FROM `table`
where ID in (5263, 5625, 5628, 5621) 

Я видел, как это можно сделать в iOS в qaru.site/info/313332/....

Как я могу сделать это в Android? Спасибо!

Изменить: Чтобы сообщить об этом, я также спросил об этом в репозитории GitHub здесь.

Ответы

Ответ 1

Обновление:

Realm 1.2.0 добавил RealmQuery.in() для сравнения с несколькими значениями. В документации описываются все доступные перегрузки. Этот метод - это метод, который мы можем использовать, если наши идентификаторы Integer s:

public RealmQuery<E> in(String fieldName, Integer[] values)

Оригинальный ответ:

Ответ от @ChristianMelchior возвращает все статьи, если список идентификаторов пуст. Я хочу, чтобы он возвращал пустой RealmResults<Article>. Это то, что я закончил делать;

Set<Integer> articleIds = this.getArticleIds();
RealmQuery<Article> query = realm.where(Article.class);
if (articleIds.size() == 0) {
    // We want to return an empty list if the list of ids is empty. 
    // Just search for an id that does not exist.
    query = query.equalTo("id", -30000);
} else {
    int i = 0;
    for (int id : articleIds) {
        // The or() operator requires left hand and right hand elements. 
        // If articleIds had only one element then it would crash with
        // "Missing right-hand side of OR"
        if (i++ > 0) {
            query = query.or();
        }
        query = query.equalTo("id", id);
    }
}
return query.findAll();

Ответ 2

Теперь realm v 1.2.0 поддерживает RealmQuery.in() для сравнения с несколькими значениями.

Ответ 3

API Realm Java API пока не поддерживает это. Вы можете выполнить запрос функции здесь https://github.com/realm/realm-java/issues/841

Нынешняя обходная задача заключалась бы в том, чтобы создать запрос самостоятельно в цикле for:

RealmResults<Article> articles = realm.allObjects(Article.class);
RealmQuery q = articles.where();
for (int id : ids) {
    q = q.equalTo("id", id);
}
RealmResults<Article> filteredArticles = q.findAll();

Ответ 4

Вот как это делает Realm начиная с версии 1.2.0:

public RealmQuery<E> in(String fieldName, String[] values) {
    if (values == null || values.length == 0) {
        throw new IllegalArgumentException(EMPTY_VALUES);
    }
    beginGroup().equalTo(fieldName, values[0]);
    for (int i = 1; i < values.length; i++) {
        or().equalTo(fieldName, values[i]);
    }
    return endGroup();
}

Ранее это, как я это сделал

Ответ 5

Я только что наткнулся на этот пост, и я подумал, что могу наложить 2 цента на это. Насколько я ценю Christian Melchior и его ответы, я думаю, что в этом случае его ответ не работает (по крайней мере, в текущей версии).

Я предпочитаю делать это так: я лично считаю это более читаемым, чем Альберт Вила:

List<String> listOfIds = [..];
RealmQuery<SomeClass> query = realm.where(SomeClass.class);

boolean first = true;
for (String id : listOfIds) {
    if (!first) {
        query.or();
    } else {
        first = false;
    }
    query.equalTo("id", id);
}
RealmResults<SomeClass> results = query.findAll();