繁体   English   中英

房间数据库中的硬编码布尔查询

[英]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 问题; 但是,我不喜欢对数据库做出这样的假设。 这个假设应该是安全的,但如果 R​​oom 决定改变它的布尔实现,它可能会在未来产生意想不到的工作。

我建议更好的方法是不要将布尔值 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM