2015-11-11 13 views
17

私はRealmデータベースを使ってAndroidアプリを構築しています。Androidのレルム - IDリスト(@PrimaryKey)で複数のオブジェクトを選択するにはどうすればよいですか?

私は(それはだとintとも@PrimaryKeyidフィールドを持つArticleと呼ばれるRealmObjectサブクラスを持っています。記事IDのintSetint[]など)のリストをクエリに渡し、それらの記事のみを取得したいと思います。 SQLで

は次のようになります:

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

私はそれがthis StackOverflow questionでのiOSでこれを行うことが可能です見てきました。

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

編集:私はGitHubレポhereにこれを尋ねました。

+0

それをやった方法です。http://stackoverflow.com/a/32068221/2413303 – EpicPandaForce

+0

@EpicPandaForceはいまったく同じです。投稿する前にたくさん検索しました。私の解決策(下記)は、IDのリストが空である場合を処理します。 –

+0

質問のタイトルに 'list'という単語を追加しました。たぶん、目標を見つけて理解するのが簡単になるでしょう。 –

答えて

22

更新:

レルム1.2.0複数の値と比較するためにRealmQuery.in()が追加されました。 The documentationは利用可能なすべてのオーバーロードを詳細に示します。

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

オリジナルの答え:This oneは、私たちのIDがIntegerのであれば、我々が使用できる方法である@ChristianMelchiorから

答えIDのリストが空の場合、すべての記事を返します。私はそれが空の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がすでにそれをやる方法を持っていたと考えていました。どうやら... – AndreiBogdan

+0

あなたは、単に '' 'for(int pos = 0; pos 0)... '' 'もちろん、結果は同じになります。int iの作成とint idの作成を保存するだけです(それぞれのarticleIdに対して新しいものを作成します)。リーク "なので...各ビットは重要です^^ – user2582318

3

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(); 
+0

ありがとう@ChristianMelchior。この回答の問題は、IDのリストが空の場合はすべての記事を返します。私の意見では、空の 'RealmResults

'を返すべきです。私は 'if'文を追加して' ids'が空であるかどうかを調べることができましたが、空の 'RealmResults
'を作成する方法が見つかりませんでした。どのようにするか知っていますか? –

+0

RealmResultsで何をしているかによって異なります。 Listインタフェースを実装しているので、空のArrayListを作成して代わりに使用できます。現在、空のRealmResultsを手動で作成する方法はありません。 –

+3

2つの事柄:メソッド 'equalsTo() '('は ')は存在しません(少なくとも0.84.1にはありません)、あなたのコードはIDのリストに1つの要素がある'または()')。とにかくありがとう! –

0

私はちょうどこのポストに出くわしました。私はこの2セントを投げ込めると思いました。私がChristian Melchiorと彼の答えに感謝している限り、彼の答えは(少なくとも現在のバージョンでは)うまくいきません。

私はこのようにそれを行うことを好む - 私は個人的にはアルバート・ヴィラの答えよりも読みやすいと思う。今、複数の値との比較のために1.2.0のサポートRealmQuery.in() V領域

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

これは、レルムは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は、この質問は非常に類似していた私は

関連する問題