房间用户可按查询配置顺序
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 "";
}
}
我正在迁移一个应用程序以从正常 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 "";
}
}