房间用户可按查询配置顺序

Room user configurable order by queries

我正在迁移一个应用程序以从正常 Sqlite 使用 Room,我遇到问题的一个部分是有几个查询具有用户可配置的 order by 语句,这意味着他们可以更改查看列表顺序的方式。

Room 似乎不允许动态排序语句,因此我必须针对每个语句排序进行单独查询。

有没有人找到解决这个问题的更好方法,所以我可以有 1 个查询语句,其中唯一改变的是 order by 子句,而在我的情况下必须编写大约 15 个额外的查询语句,基本上都是相同的?

Our Dao 的方法中不能使用参数。

@Query("SELECT * FROM sometable order by :orderClause DESC")
    List<Islem> findOneUserName(String orderClause);//didn't work

此查询参数仅在where参数中使用以避免Sql注入。

我现在面临同样的问题。可以做的是使用 CASE:

SELECT * FROM Table
ORDER BY 
CASE WHEN :parameter = 1 THEN Column END ASC,
CASE WHEN :parameter = 2 THEN Column2 END DESC

但我假设您也在使用 ViewModel,因此您可能每次都必须重新初始化它。我认为这种方式比编写 15 个查询要好一点,但可能没有那么紧凑。

这个也有一个很好的例子,但我认为逻辑是相反的。

在 Room 1.1 中现在有一个 RawQuery 可以用来解决这个问题

 @Dao
 interface RawDao {
     @RawQuery
     User getUserViaQuery(SupportSQLiteQuery query);
 }
 SimpleSQLiteQuery query = new SimpleSQLiteQuery("SELECT * FROM User WHERE id = ? LIMIT 1",
         new Object[]{userId});
 User user2 = rawDao.getUserViaQuery(query);

https://developer.android.com/reference/android/arch/persistence/room/RawQuery

正如 tyczj 已经建议的,您可以给我们一个 RawQuery。此外,SimpleSQLiteQuery 也可以移动到 DAO 中,因此在 DAO 之外没有 SQL 语句。

DAO 也可以通过抽象来定义class。这允许您添加一个执行 SimpleSQLiteQuery.

的方法

示例:

@DAO
public abstract class UserDao {

    @RawQuery
    public abstract List<User> getUsersViaRawQuery(SupportSQLiteQuery query);

    public List<User> getUsersOrderBy(String column) {
        String statement = "SELECT * FROM user ORDER BY " + column + " ASC";
        SupportSQLiteQuery query = new SimpleSQLiteQuery(statement, new Object[]{});
        return getUsersViaRawQuery(query);
    }

}

列参数也可以替换为枚举,它只允许特定值。

示例:

private static String createOrderByString(Order order) {
    switch (order) {
        case NAME:
            return "ORDER BY first_name ASC, last_name ASC";
        case AGE:
            return "ORDER BY age DESC";
        default:
            return "";
    }
}