如何在room数据库中传递列名作为参数?

e3bfsja2  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(260)

这个问题在这里已经有答案了

room:在dao方法中传递列名作为参数(2个答案)
28天前关门了。
我正在使用 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();

所以问题是,是否可以进行一个通用查询并将列名作为参数传递?例如:

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

我知道我引用的是columnname,但如果columnname是type int 不应该吗?

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

23c0lvtd1#

简而言之:你不能这样做,因为sqlite不允许这样做,检查这里。
长话短说:
您的模型有几个缺点:
数据库设计模式:不是说一个好的数据库设计在数据规范化方面;为什么?你有一个专栏 sweets ,另一个 drinks ,也许一个 meals .. 更多的列,意味着更多的数据存储,记录中更多的可空字段,并且您需要一个数据库方法来分别查询每一列(比如您的问题是什么)
使用变量列名很容易出错:如果传入的列在数据库中不存在该怎么办。。这是 Room 提供给你的信息过于抽象 SQL queries whereroom为错误的列名提供编译时错误,而普通sqlite在运行时会引发这些错误。
我鼓励您:
创建一个表示食物类型的单列;为了提高效率,您可以创建 int ,并将每个整数值Map到特定类型的食物:

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 ,并进行房间类型转换。

相关问题