如何在房间数据库中将列名作为参数传递?
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 不允许这样做,。
长答案:
您的模型有几个缺点:
- 数据库设计模型:就data normalization而言不是一个好的数据库设计;为什么?您有一列用于
sweets
,另一列用于 drinks
,也许还有一列用于 meals
..更多的列,意味着更多的数据存储,记录中更多的可为空的字段,并且您需要一个数据库分别查询每一列的方法(比如你的问题)
- 拥有一个可变的列名可能容易出错:如果你传入一个数据库中不存在的列怎么办..这是功能之一
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
并进行房间类型转换。
我正在使用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 不允许这样做,
长答案:
您的模型有几个缺点:
- 数据库设计模型:就data normalization而言不是一个好的数据库设计;为什么?您有一列用于
sweets
,另一列用于drinks
,也许还有一列用于meals
..更多的列,意味着更多的数据存储,记录中更多的可为空的字段,并且您需要一个数据库分别查询每一列的方法(比如你的问题) - 拥有一个可变的列名可能容易出错:如果你传入一个数据库中不存在的列怎么办..这是功能之一
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
并进行房间类型转换。