[英]Hardcode Boolean Query In Room Database
我正在构建一个显示用户潜在匹配列表的 Android 应用程序。 用户可以点击一个点赞用户,我把所有点赞都保存在本地。
我可以编写一个查询来获取这样的匹配列表:
@Query("SELECT * FROM match WHERE liked = :liked ORDER BY match DESC LIMIT :limit")
fun getMatches(limit: Int = 6, liked: Boolean = true): Flowable<List<Match>>
我了解到这很好用。 但是,我没有预见到我会将liked
设置为 false 的任何情况,所以我很好奇是否有办法对我的布尔条件进行硬编码? 如果我尝试:
@Query("SELECT * FROM match WHERE liked = true ORDER BY match DESC LIMIT :limit")
我在编译时收到以下错误:
Error:(8, 0) Gradle: error: There is a problem with the query: [SQLITE_ERROR] SQL error or missing database (no such column: true)
如何在我的查询字符串中硬编码这个布尔值?
我也试过:
@Query("SELECT * FROM match WHERE liked = 'true' ORDER BY match DESC LIMIT :limit")
SQLite 没有布尔数据类型。 Room 将其映射到INTEGER
列,将true
映射到1
并将false
映射到0
。
所以,我希望这能奏效:
@Query("SELECT * FROM match WHERE liked = 1 ORDER BY match DESC LIMIT :limit")
请记住,这种行为是无证的。 然而,它不应该改变——至少在没有警报响起的情况下不会改变——因为我们需要使用迁移来处理任何变化。
CommonWare 的方法确实有效,并且还直接回答了 OP 问题; 但是,我不喜欢对数据库做出这样的假设。 这个假设应该是安全的,但如果 Room 决定改变它的布尔实现,它可能会在未来产生意想不到的工作。
我建议更好的方法是不要将布尔值 1 或 0 硬编码到查询中。 如果数据库位于存储库之后,存储库仍然可以公开优雅的 API。 就我个人而言,我认为将更大的代码库与数据库实现隔离开来是一件好事。
Dao 方法(从 OP 的问题中复制)
@Query("SELECT * FROM match WHERE liked = :liked ORDER BY match DESC LIMIT :limit")
fun getMatches(limit: Int = 6, liked: Boolean = true): Flowable<List<Match>>
存储库
class Repository {
public Flowable<List<Match>> getLikedMatches() {
return dao.getMatches(6, true);
}
}
当然,这是一个固执的选择,因为它假定了某种架构风格。 但是,它不会对内部数据库做出假设。 即使没有存储库屏蔽数据库,也可以通过在任何地方传递 true 来调用数据库 - 也无需对底层数据进行假设。
您不必将布尔列与值进行比较。 只需将列值本身用作布尔表达式。 您可以轻松地将查询更改为SELECT * FROM match WHERE liked ORDER BY match DESC LIMIT :limit
。 如果要与false
值进行比较,可以使用以下表达式: where not liked
。
@Query("SELECT * FROM searched_data_table WHERE favourit_history==1 ORDER BY lang_id DESC")
使用此查询从表中搜索数据,这将为您提供关于您的键值的降序数据
我有一个类似的问题要解决。 我想首先使用where boolean field = false
元素,然后使用boolean field where = true
你对这个表达有什么想法吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.