Android会议室:订单不工作

Sir*_*lon 34 android android-room android-architecture-components

我正在使用新的Android ORM Room.我遇到了以下问题,使用带参数的ORDER BY的查询不起作用.

如果我想使用从ORDER BY的参数填充的字段,它不起作用.它只是没有任何排序.

@Query("SELECT * FROM User ORDER BY :orderBY ASC")
List<User> sortedFind(String orderBY);
Run Code Online (Sandbox Code Playgroud)

但是,当我将ORDER BY列直接放在查询中以对结果进行排序时,它会按预期工作.

@Query("SELECT * FROM User ORDER BY name ASC")
List<User> sortedFind();
Run Code Online (Sandbox Code Playgroud)

这是Android Room上的错误,还是我做错了什么?

小智 11

如果您在字符串字段上尝试 order by 那么您可能会遇到字符串大小写问题,那么您应该尝试使用LOWER(your_string_field_name)UPPER(your_string_field_name) 如下所示:

@Query("SELECT * FROM User ORDER BY LOWER(name) ASC"
Run Code Online (Sandbox Code Playgroud)

享受编码:)


Sha*_*ami 10

您应该使用@RawQuery注释和SupportSQLiteQuery类进行运行时查询

在道:

 @RawQuery
 List<Objects> runtimeQuery(SupportSQLiteQuery sortQuery);
Run Code Online (Sandbox Code Playgroud)

获取数据:

String query ="SELECT * FROM User ORDER BY " + targetField + " ASC";
List<Objects> users = appDatabase.daoUser().runtimeQuery(new SimpleSQLiteQuery(query));
Run Code Online (Sandbox Code Playgroud)


Jac*_*ton 9

怎么了

您可以作为参数传递给@Dao方法的唯一值是值,而不是查询字符串.这个(我相信)的原因是为了防止SQL注入问题.

为什么会这样

例如,查询SELECT * emails WHERE uid = ?然后将值设置为"1 OR WHERE isAdmin = true".这将允许人们在您的数据库上运行他们自己的定制查询并执行他们想要的操作.

我的解决方案

我也遇到了这个问题.这是我的解决方案的链接.

我的解决方案有2个部分.首先DynamicQueryservice根据输入生成查询字符串和值数组,然后运行原始查询并返回一个Cursor.第二,Cursor2POJO映射器,所以我不必为类反复写出游标映射,也不必引入潜在的维护问题.我只是在我的类中添加注释(与房间列名称匹配),lib处理其余的.

为了您的利益,我已经将我的Cursor映射器分离到它自己的中,随意使用它(如果自述文件不清楚,或者在评论中有错误,我就这样做了).

PS我的库无法使用Room @ColumnInfo来获取列名,因为注释当前设置为RetentionPolicy.CLASS,因此无法通过反射访问.(已添加到Google问题跟踪器https://issuetracker.google.com/issues/63720940)