我正在使用新的 Android ORM Room。我遇到了以下问题,使用带参数的 ORDER BY 的查询不起作用。
如果我想使用从 ORDER BY 的参数填充的字段,它不起作用。它只是不排序任何东西。
@Query("SELECT * FROM User ORDER BY :orderBY ASC")
List<User> sortedFind(String orderBY);
但是,当我将 ORDER BY 列直接放在查询中以对结果进行排序时,它会按预期工作。
@Query("SELECT * FROM User ORDER BY name ASC")
List<User> sortedFind();
这是 Android Room 上的错误,还是我做错了什么?
原文由 Sirelon 发布,翻译遵循 CC BY-SA 4.0 许可协议
怎么了
您可以作为参数传递给
@Dao
方法的唯一值是值,而不是查询字符串。这样做的原因(我相信)是为了防止 SQL 注入问题。为什么会这样
例如查询
SELECT * emails WHERE uid = ?
然后将值设置为"1 OR WHERE isAdmin = true"
。这将允许人们在您的数据库上运行他们自己定制的查询并做他们想做的事。我的解决方案
我也遇到了这个问题。这是我的 解决方案 的链接。
我的解决方案有两部分。首先
DynamicQueryservice
根据输入生成查询字符串和值数组,然后运行原始查询并返回Cursor
。其次,一个Cursor2POJO
映射器,这样我就不必为类一遍又一遍地写出游标映射,也不必引入潜在的维护问题。我只是在我的类中添加注释(与房间列名称匹配),库处理其余部分。为了您的利益,我已经将我的 Cursor 映射器分离到它自己的 库 中,请随意使用它(如果自述文件不清楚,或者评论中有错误,请随意使用)。
PS 我的图书馆无法使用 Room @ColumnInfo 获取列名,因为注释当前设置为 RetentionPolicy.CLASS,因此无法通过反射访问。 (已添加到 Google 问题跟踪器 https://issuetracker.google.com/issues/63720940 )