我正在迁移一个应用程序以使用正常Room
中的Sqlite
,而我遇到问题的一个部分是,有几个查询具有用户可配置的order by语句,这意味着它们可以改变他们想要查看列表顺序的方式。
看起来房间不允许按语句进行动态排序,因此我必须按照声明对每个订单进行单独的查询。
有没有人找到一个更好的解决这个问题的方法所以我可以有一个查询语句,其中唯一改变的是order by子句vs必须写出我的情况下大约15个额外的查询语句基本相同?
答案 0 :(得分: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);
https://developer.android.com/reference/android/arch/persistence/room/RawQuery
答案 1 :(得分:4)
我现在面临同样的问题。可以做的是使用CASE:
SELECT * FROM Table
ORDER BY
CASE WHEN :parameter = 1 THEN Column END ASC,
CASE WHEN :parameter = 2 THEN Column2 END DESC
但我假设你也在使用ViewModel
,所以你可能每次都要重新初始化它。我认为这种方式比编写15个查询要好一些,但可能不是那么紧凑。
这个answer也有一个很好的例子,但我认为逻辑是相反的。
答案 2 :(得分:1)
正如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);
}
}
column参数也可以用一个枚举代替,该枚举只允许特定的值。
示例:
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 "";
}
}
答案 3 :(得分:0)
你不能在我们的Dao方法中使用参数。
@Query("SELECT * FROM sometable order by :orderClause DESC")
List<Islem> findOneUserName(String orderClause);//didn't work
此Query参数仅用于避免Sql注入的参数。