Android 房间DAO按ASC或DESC变量排序
我试图在我的Android 房间DAO按ASC或DESC变量排序,android,android-room,dao,Android,Android Room,Dao,我试图在我的@Dao界面中创建一个@Query函数,该函数有一个布尔参数,isAsc,以确定顺序: @Query("SELECT * FROM Persons ORDER BY first_name (:isAsc ? ASC : DESC)") List<Person> getPersonsAlphabetically(boolean isAsc); 创建两个查询,一个带有ASC,另一个带有DESC @Query("SELECT * FROM Persons ORDER BY l
@Dao
界面中创建一个@Query
函数,该函数有一个布尔参数,isAsc
,以确定顺序:
@Query("SELECT * FROM Persons ORDER BY first_name (:isAsc ? ASC : DESC)")
List<Person> getPersonsAlphabetically(boolean isAsc);
创建两个查询,一个带有ASC,另一个带有DESC
@Query("SELECT * FROM Persons ORDER BY last_name ASC")
List<Person> getPersonsSortByAscLastName();
@Query("SELECT * FROM Persons ORDER BY last_name DESC")
List<Person> getPersonsSortByDescLastName();
@Query(“按姓氏ASC从人员订单中选择*)
列出GetPersonSortByAsclatName();
@查询(“按姓氏描述从人员订单中选择*)
列出GetPersonSortByDesclastName();
你为什么不试试这样的东西呢?我还没有测试过
@Query("SELECT * FROM Persons ORDER BY first_name :order")
List<Person> getPersonsAlphabetically(String order);
@Query(“按姓名从人员订单中选择*)\u订单)
按字母顺序列出GetPerson(字符串顺序);
您建议的逻辑应该在您进行查询之前进行。使用
CASE Expression
forSQLite在房间DAO中实现这一点
@Query("SELECT * FROM Persons ORDER BY
CASE WHEN :isAsc = 1 THEN first_name END ASC,
CASE WHEN :isAsc = 0 THEN first_name END DESC")
List<Person> getPersonsAlphabetically(boolean isAsc);
@Query(“按订单从人员中选择*”
案例:isAsc=1,然后第一个名称结束ASC,
案例:isAsc=0,然后是“第一个名称结束描述”)
按字母顺序列出GetPerson(布尔isAsc);
这对我来说似乎很奇怪,创建了两个查询,其中唯一的区别是ASC和DESCyes,而不是您所寻找的解决方案。不起作用。给出错误:(“,”)、ASC、BEVER、COLLATE、DESC、IN、LIMIT、逗号或分号,应为GET):order.Plus..由于“ACS”和“DECS”,这很容易出错。你知道吗?你确定你写得很好吗?而且,与你的示例中的任何其他必须手动编写ASC或DESC的代码相比,这不会更容易出错……它写得很好,并且出现了相同的错误。IDE很容易解释sql查询,并希望保留sql字按顺序排列,而不是按变量字符串排列。如果没有完全消除容易出错的代码我想你所要求的是做不到的。很抱歉听到这个消息。布尔值可能会减少或消除容易出错的代码,我同意;但是你的示例和我的示例的工作原理完全相同,因为你必须从布尔值转换为字符串。这就是我在前面的评论中的意思。仅供参考sqlite查询选项mizer不会对此进行适当优化。它将始终生成一个临时的B-树。对于android提供的较旧版本的SQLite,尤其如此。
@Query("SELECT * FROM Persons ORDER BY
CASE WHEN :isAsc = 1 THEN first_name END ASC,
CASE WHEN :isAsc = 0 THEN first_name END DESC")
List<Person> getPersonsAlphabetically(boolean isAsc);