部屋データベースのパラメータとして列名を渡す方法は?[複製]

Dec 11 2020

私は使用roomdatabaseしていますが、クエリするカテゴリがたくさんあります。

@Query("SELECT * FROM Table_name WHERE sweets = 1")
LiveData<List<Item>> getAllSweets();

@Query("SELECT * FROM Table_name WHERE drinks = 1")
LiveData<List<Item>> getAllDrinks();

だから問題は、1つのユニバーサルクエリを作成し、パラメータとして列名を渡すことは可能ですか?例えば:

@Query("SELECT * FROM Table_name WHERE :columnname = drinks AND :columnname = 1")
LiveData<List<Item>> getAllDrinks(String drinks); 

columnNameを参照していることは知っていますが、columnNameがタイプの場合、そうintではありませんか?

LiveData<List<Item>> getAllDrinks(int drinks)

回答

Zain Dec 11 2020 at 22:23

簡単な答え: SQLiteでは許可されていないため、これを行うことはできません。こちらを確認してください。

長い答え:

モデルにはいくつかの欠点があります。

  1. データベース設計モデル:データの正規化に関しては、それほど優れたデータベース設計ではありません。どうして?の列sweets、別の列drinks、おそらく1つのmeals列があります。列が多いほど、データストレージが多くなり、レコード内のnull可能フィールドが多くなります。また、各列を個別にクエリするためのデータベースメソッドが必要です(質問の内容など)。
  2. 変数の列名を設定すると、エラーが発生しやすくなります。データベースに存在しない列を渡した場合はどうなりますか。これは、Roomがコンパイル時エラーを提供するRoom抽象を介して提供される機能の1つです。SQL queries通常のSQLiteが実行時に列名を上げるのに間違った列名。

私があなたに勧めること:

食品の種類を示す単一の列を作成します。効率を上げるために、タイプを作成し、int各整数値を特定のタイプの食品にマッピングできます。

1 >> goes for >> sweats 
2 >> goes for >> drinks
and so on..

これで、単一の列ができました(モデルのように複数ではありません)。これで、単一のDAOメソッドで任意のタイプ(要求していた)にアクセスできます。

@Query("SELECT * FROM Table_name WHERE :foodtype = type")
LiveData<List<Item>> getAllDrinks(int type) // add the type

注:読みやすくするEnumために、フィールドに 'を使用して、部屋タイプを変換することもできます。