我正在将一个应用程序从普通的Sqlite
迁移到使用Room
,我遇到的一个问题是,有几个查询具有用户可配置的order by语句,这意味着它们可以更改查看列表顺序的方式。
房间里似乎不允许动态order by语句,所以我必须针对每个order by语句进行单独的查询。
有没有人找到更好的方法来解决这个问题,这样我就可以有一个查询语句,其中唯一需要改变的是order by子句,而不是必须编写15个基本相同的额外查询语句?
正如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);
}
}
列参数也可以用枚举替换,枚举只允许特定的值。
例子:
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 "";
}
}
在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
我现在也面临同样的问题。可以做的事情是使用用例:
SELECT * FROM Table
ORDER BY
CASE WHEN :parameter = 1 THEN Column END ASC,
CASE WHEN :parameter = 2 THEN Column2 END DESC
但我假设您也在使用ViewModel
,所以您可能每次都需要重新初始化它。我认为这种方式比编写15个查询要好一点,但可能没有那么紧凑。
这个答案也有一个很好的例子,但是我相信逻辑是相反的。
问题内容: 我在编写sql从表中获取可用空间时遇到问题。 我的表结构如下。 一个房间可以链接到许多预订,一个预订可以包含很多房间 我已经尝试过了,但是如果一个房间在两个不同的日期链接到两个不同的预订会比较麻烦,那么只有第一个预订ID才能进行比较 有人可以帮我编写SQL,以便在入住和退房之间获得可用的房间。 问题答案: 如果您想要的只是在所需日期的整个范围内可用的房间列表,那么类似以下的方法可能会起
问题内容: 我在编写sql以从表中获取可用房间时遇到问题。我的表结构如下。 表:预订 桌子:房间 包含有关房间的详细信息,该表的主键是room_id,它具有1至10个房间,共10个房间。 我的问题是我想知道这些房间在2012年9月14日6:00 pm至21-09-2012 9:00 am之间可用,这意味着我应该只将room_id的结果作为1,3,5,7,8 ,9,10。 有人可以帮我编写SQL来从
问题内容: 我有一个酒店预订系统的查询,当有特定房间时,我需要查找日期。(这是一家精品酒店,人们在其中预订特定的房间,因此在获得此代码之前,他们知道他们想要的确切房间。 我要查找的结果是一个房间的详细信息,我在查询中指定了一个房间-我是不查找多个房间的信息。 ) “可用性”表模式很简单,每一行是: 因此,例如,如果某个房间在1月1日至1月5日期间被占用,则将五行添加到可用性表中,每一天占据该房间。
说明 微信支付查询订单SDK。 官方文档:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_2 类 请求参数类 请求参数 类名:\Yurun\PaySDK\Weixin\OrderQuery\Request 属性 名称 类型 说明 $_apiMethod string 接口名称 $transaction_id string
说明 支付宝境外到店支付-订单查询 官方文档:https://global.alipay.com/service/external_QR_Code/28 类 请求参数类 请求参数 类名:\Yurun\PaySDK\AlipayCrossBorder\InStore\Query\Request 属性 名称 类型 说明 $service string 接口名称 $partner_trans_id st