web-dev-qa-db-ja.com

Android-レルムのID(@PrimaryKey)のリストで複数のオブジェクトを選択する方法?

Realmデータベースを使用してAndroidアプリを構築しています。

私はRealmObjectというArticleサブクラスを持っています。これにはidフィールドがあります(それとint@PrimaryKey)。クエリに記事IDのints(Setint[]など)のリストを渡して、それらの記事のみを取得したいと思います。

SQLでは次のようになります。

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

このStackOverflowの質問 でiOSでこれを実行できることを確認しました。

Androidでこれを行うにはどうすればよいですか?ありがとう!

編集:お知らせのために、GitHubリポジトリでもこれを尋ねました こちら

19

更新:

レルム1.2.0では、複数の値と比較するためにRealmQuery.in()が追加されました。 ドキュメント は、利用可能なすべてのオーバーロードの詳細です。 これ は、IDがIntegersの場合に使用できる方法です。

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

元の答え:

IDのリストが空の場合、@ 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();
24

現在、レルムv 1.2.0は、複数の値と比較するためのRealmQuery.in()をサポートしています。

4
mouness2020

レルム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();
3

これは、レルムが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();
}

以前は this が私がやった方法です

2
EpicPandaForce

私はこの投稿に出くわしただけで、これに2セントを投入できると思いました。私はクリスチャン・メルキオールと彼の答えに感謝しますが、この場合彼の答えは機能していません(少なくとも現在のバージョンでは)。

私はこのようにするのが好きです-私は個人的にはアルバート・ビラの答えよりも読みやすいと思います:

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();
1