房间用户可通过查询配置订单

tyc*_*czj 8 android android-room android-architecture-components

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

似乎房间不允许按语句进行动态排序,因此我必须根据每个订单的声明进行特定的查询.

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

Sul*_*man 7

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

SELECT * FROM Table
ORDER BY 
CASE WHEN :parameter = 1 THEN Column END ASC,
CASE WHEN :parameter = 2 THEN Column2 END DESC
Run Code Online (Sandbox Code Playgroud)

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

这个答案也有一个很好的例子,但是我相信逻辑是相反的。


Mat*_* Ke 6

正如tyczj已经建议的那样,您可以使用RawQuery. 此外,SimpleSQLiteQuery还可以将其移至 DAO 中,这样 DAO 之外就没有 SQL 语句了。

DAO 也可以通过抽象类来定义。这允许您添加一个执行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);
    }

}
Run Code Online (Sandbox Code Playgroud)

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

例子:

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 "";
    }
}
Run Code Online (Sandbox Code Playgroud)


tyc*_*czj 5

在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);
Run Code Online (Sandbox Code Playgroud)

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