1. ホーム
  2. android

部屋 - IN条件でクエリを選択しますか?

2023-08-16 23:52:01

質問

SQLiteの IN 条件を使用することはできますか?

データベースから項目のリストを選択しようとしているのですが、特定のカラムの値(この場合は TEXT カラム) の値がフィルター値のセットのいずれかに一致する場合、データベースからアイテムのリストを選択しようとしています。私の知る限り、これは SQL や SQLite では非常に簡単にできます。 IN 条件を SELECT ステートメント ( こちらをご覧ください ). しかし、Roomではうまくいかないようです。

このエラーが出続けています。

Error:(70, 25) error: no viable alternative at input 'SELECT * FROM Table WHERE column IN :filterValues'

(ここで、DAOへの入力は @Query -というアノテーションされたメソッドが filterValues )

現在、3種類の方法を試しています。

  1. 引数を List<String>
  2. 引数を String[]
  3. そして最後に、引数を単に String として渡すこともできますが、フォーマット的には (value_1, value_2, ..., value_n)

特に最後のものは簡単に動作するはずです。 SELECT * FROM Table WHERE column IN (value_1, value_2, ..., value_n) に直接変換され、これは手動で SELECT を手動で書き出すのと同じです。

どのように解決するのですか?

そこで、これを提出する準備をしているときに、以前調べたものをたくさん再確認したところ、私がなんとなく見落としていた、この質問が必要なくなるようなものを見つけました。

結論から言うと、この2つの選択肢はどちらも

  1. として引数を渡すこと。 List<String>
  2. 引数を String[]

は実行可能です(そして String をデータベースが表現できる任意の型、例えば char あるいは int ) の構文を変更するだけです。 @Query アノテーションの構文をこのように変更するだけです。

@Query("SELECT * FROM Table WHERE column IN :filterValues")

をこれに変更します。

@Query("SELECT * FROM Table WHERE column IN (:filterValues)")

簡単でしょう?

上の3番目の方法(引数を単に String として渡すが、書式は (value_1, value_2, ..., value_n) ) は Room ではサポートされていないようですが、それは難しい方法なので、おそらく悪いことではありません。

私はすでにすべてをタイプアウトしていたので、他の人々が私と同じようにこの解決策を見つけるのに苦労し、この質問につまずく場合に備えて、質問を残しておこうと考えました。