【问题标题】:How to pass column name as a parameter in room database? [duplicate]如何在房间数据库中将列名作为参数传递? [复制]
【发布时间】:2020-12-11 14:33:35
【问题描述】:

我使用的是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)

【问题讨论】:

    标签: java android android-sqlite android-room


    【解决方案1】:

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

    长答案:

    您的模型有几个缺点:

    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's 并进行房间类型转换。

    【讨论】:

    • 谢谢,你是对的。我有一个问题。因为在评论中阅读代码很难阅读,我在这个中做了一切:bugsdb.com/_en/debug/ea279e097a7dcf9fc9b36faa7eaeb1ad。但是我之前没有使用枚举,所以我有一个问题。当我在我的应用程序中保存选择的类别(糖果或饮料等)时,我会像 Item.Categories food = Item.Categories.SWEETS; 那样做,并且与饮料等类似。这很好吗?这是使用枚举将所选数据(例如糖果)保存为糖果类别的正确方法吗?
    • @Rivke 是的,这比在不同的类周围使用抽象数字更好且更易读;你也可以看看How to do enum Type Conversion and save them into Room
    • 我还有一个问题。当我将 item 对象从一个活动传递到另一个活动时,它在 food_type 中给了我 null 但 name_product 和 amount 读取正确。当我仅通过意图 food_type 时,它​​会给出错误/警告 ``` Key TEKSAS 预期 Parcelable 但值是 com.example.project.Item$Food_type。返回默认值 。 ``` 如果我使用这个查询房间 --> ``` Item item_get2 = Item_DATABASE.getInstance(getApplicationContext()).item_dao().getItemById(id); ``` 效果很好。那么为什么我不能直接通过意图传递呢?
    • 另外在第一个活动中,food_type 显示正确的值 (Log.i) 所以问题是在我认为的活动之间传递时。
    猜你喜欢
    • 2017-08-12
    • 2012-02-23
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    相关资源
    最近更新 更多