如何在房间数据库中将列名作为参数传递?

How to pass column name as a parameter in room database?

我正在使用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 是 int 类型,它不应该是?

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

简短回答:你不能这样做,因为 SQLite 不允许这样做,

长答案:

您的模型有几个缺点:

  1. 数据库设计模型:data normalization而言不是一个好的数据库设计;为什么?您有一列用于 sweets,另一列用于 drinks,也许还有一列用于 meals..更多的列,意味着更多的数据存储,记录中更多的可为空的字段,并且您需要一个数据库分别查询每一列的方法(比如你的问题)
  2. 拥有一个可变的列名可能容易出错:如果你传入一个数据库中不存在的列怎么办..这是功能之一Room 为您提供抽象 SQL queries,其中 Room 为您提供错误列名的编译时错误,而普通 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 并进行房间类型转换。