首页 文章

房间数据库全动态查询

提问于
浏览
4

我有对象硬币的房间数据库 .

我想用参数进行动态查询 .

当我使用参数作为值时,它的效果很好,如下所示:

@Query("select * from coin ORDER BY percent_change_24h asc limit :numberOfCoins")
fun getAllTop(numberOfCoins: Int): Flowable<List<CoinDB>>

但是当我想为WHERE子句使用参数时,这不起作用 . 这是我的查询:

@Query("select * from coin ORDER BY :order asc limit :numberOfCoins")
fun getAllTop(order: String, numberOfCoins: Int): Flowable<List<CoinDB>>

我称之为:

AppDatabase.getInstance(this).coinDao().getAllTop("percent_change_24h",5)

使用隐式WHERE子句调用相同的查询工作正常(像这样:)

@Query("select * from coin ORDER BY percent_change_24h asc limit :numberOfCoins")
fun getAllTop(order: String, numberOfCoins: Int): Flowable<List<CoinDB>>

2 回答

  • 12

    您不能使用绑定变量(参数)来引用ORDER BY子句中的列 . 但是,您可以在表达式中使用bind变量,如下所示:

    @Query("select * from coin ORDER BY
    CASE :order
    WHEN 'percent_change_24h' THEN percent_change_24h
    WHEN 'other_column_name' THEN other_column_name
    END asc limit :numberOfCoins")
    fun getAllTop(order: String, numberOfCoins: Int): Flowable<List<CoinDB>>
    

    对于要排序的每个列/表达式,您需要为CASE语句添加单独的WHEN子句,并且您可能需要或想要为以下情况添加ELSE子句:order bind变量不匹配任何你的标准案例 .

    绑定变量的限制也适用于where子句和投影(选择列表) . 绑定变量在您的示例中具有自己的值,分别为String或Int:order和:numberOfCoins .

  • 2

    以下是kotlin语言中关于值如何完全动态的示例,

    @Query("SELECT * FROM Test where testId = :arg0")
    fun loadTestById(testId: Int): Test
    

    这里的test是tableName,testId是应用WHERE子句的字段,testId是传递给函数loadTestById()的参数,返回类型是名为Test的数据模型类 .

    Query("select * from coin ORDER BY order=:arg0 asc limit numberOfCoins=:arg1")
    fun getAllTop(order: String, numberOfCoins: Int): Flowable<List<CoinDB>>
    

相关问题