【问题标题】:Room DAO Order By ASC or DESC variableRoom DAO 按 ASC 或 DESC 变量排序
【发布时间】:2019-08-13 07:05:49
【问题描述】:

我正在尝试在我的@Dao 接口中创建一个@Query 函数,它有一个布尔参数isAsc 来确定顺序:

@Query("SELECT * FROM Persons ORDER BY first_name (:isAsc ? ASC : DESC)")
List<Person> getPersonsAlphabetically(boolean isAsc);

显然这是不允许的。这里有工作吗?

编辑:

使用两个查询(如下)似乎很奇怪,因为唯一的区别是 ASCDESC

@Query("SELECT * FROM Persons ORDER BY last_name ASC")
List<Person> getPersonsSortByAscLastName();

@Query("SELECT * FROM Persons ORDER BY last_name DESC")
List<Person> getPersonsSortByDescLastName();

【问题讨论】:

    标签: android android-room dao


    【解决方案1】:

    Room DAO 中为 SQLite 使用 CASE Expression

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

    【讨论】:

    • 仅供参考,sqlite 查询优化器不会正确优化它。它总是会生成一个临时的 B-Tree。对于 Android 提供的旧版 SQLite 尤其如此。
    【解决方案2】:

    创建两个查询,一个使用 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();
    

    【讨论】:

    • 这对我来说似乎很奇怪,创建了两个查询,唯一的区别是 ASC 和 DESC
    • 是的,显然不是您正在寻找的解决方案
    【解决方案3】:

    你为什么不尝试这样的事情呢?我没有测试过。

    @Query("SELECT * FROM Persons ORDER BY first_name :order")
    List<Person> getPersonsAlphabetically(String order);
    

    您建议的逻辑应该在您进行查询之前进行。

    【讨论】:

    • 试过了。不工作。给出错误:(','。',ASC,BETWEEN,COLLATE,DESC,IN,LIMIT,逗号或分号预期,得到':order。另外..由于“ACS”和“DECS”,这很容易出错. 你知道
    • 你确定你写得好吗?
    • 此外,与您的示例中必须手动编写 ASC 或 DESC 的任何其他代码相比,这不再容易出错......
    • 它在this 上写得很好并且得到了同样的错误。 IDE 很容易解释 sql 查询,并期望在 ORDER BY 之后保留的 sql 字不是变量字符串。如果不能完全消除容易出错的代码,布尔变量会减少
    • 我喜欢这些答案,因为它们非常错误,但教我们什么不该做!请不要删除这个(尝试)答案。
    猜你喜欢
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多