首页 > 解决方案 > 如何在房间数据库中将列名作为参数传递?

问题描述

我正在使用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)

标签: javaandroidandroid-sqliteandroid-room

解决方案


简短回答:您不能这样做,因为 SQLite 不允许这样做,请查看此处

长答案:

您的模型有几个缺点:

  1. 数据库设计模型:就数据规范化而言,不是一个好的数据库设计;为什么?您有一列 for sweets,另一列 for drinks,也许一meals列 .. 更多列,意味着更多数据存储,记录中更多可空字段,并且您需要一个数据库方法来分别查询每一列(就像您的问题一样)
  2. 有一个可变的列名可能容易出错:如果你传入一个数据库中不存在的列怎么办。这是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 用于您的字段并进行房间类型转换。


推荐阅读