房间数据库全动态查询

时间:2018-01-09 16:40:09

标签: android mysql sqlite kotlin android-room

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

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

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

@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 个答案:

答案 0 :(得分:13)

您不能使用绑定变量(参数)来引用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变量不对其进行排序。 ; t匹配任何标准情况。

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

答案 1 :(得分:3)

以下是科特林语言中的示例,说明了如何使值完全动态

@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>>