java - 如何在房间数据库中将列名作为参数传递?
问题描述
我正在使用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 是 typeint
它不应该是?
LiveData<List<Item>> getAllDrinks(int drinks)
解决方案
简短回答:您不能这样做,因为 SQLite 不允许这样做,请查看此处。
长答案:
您的模型有几个缺点:
- 数据库设计模型:就数据规范化而言,不是一个好的数据库设计;为什么?您有一列 for
sweets
,另一列 fordrinks
,也许一meals
列 .. 更多列,意味着更多数据存储,记录中更多可空字段,并且您需要一个数据库方法来分别查询每一列(就像您的问题一样) - 有一个可变的列名可能容易出错:如果你传入一个数据库中不存在的列怎么办。这是
Room
为你提供的抽象功能之一,SQL queries
其中 Room 为你提供编译时错误错误的列名,而普通 SQLite 在运行时引发它们。
我鼓励你做的事:
创建一个指示食物类型的列;为了提高效率,您可以创建 type 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
's 用于您的字段并进行房间类型转换。
推荐阅读
- python - 如何上传文件或丢失的目录
- google-apps-script - 在多个共享的 google word 文档中自动添加某些文本和表格
- javascript - Lodash 设置整数路径奇怪的行为
- java - Jenetics:如何解释并得到染色体的结果?
- c - 如何在 C 编程中生成具有特定区域附加特定数字的矩阵?
- azure-cognitive-search - ComplexType:根据内部数据分析进行查询
- android - 更新通知操作的正确方法
- python - 我应该如何为 CBC 代码实现初始化向量?
- python - 每次我需要使用它时定义一个函数python
- api - 如果删除过滤视图没有要删除的内容,则调用创建过滤视图函数