部屋データベースのパラメータとして列名を渡す方法は?[複製]
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では許可されていないため、これを行うことはできません。こちらを確認してください。
長い答え:
モデルにはいくつかの欠点があります。
- データベース設計モデル:データの正規化に関しては、それほど優れたデータベース設計ではありません。どうして?の列
sweets
、別の列drinks
、おそらく1つのmeals
列があります。列が多いほど、データストレージが多くなり、レコード内のnull可能フィールドが多くなります。また、各列を個別にクエリするためのデータベースメソッドが必要です(質問の内容など)。 - 変数の列名を設定すると、エラーが発生しやすくなります。データベースに存在しない列を渡した場合はどうなりますか。これは、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
ために、フィールドに 'を使用して、部屋タイプを変換することもできます。