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