室内数据库中的硬编码布尔查询

Ada*_*331 47 android android-room

我正在构建一个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>>
Run Code Online (Sandbox Code Playgroud)

我已经知道这很好用.但是,我没有预见到任何我会设置liked为false的情况,所以我很好奇是否有办法硬编码我的布尔条件?如果我尝试:

@Query("SELECT * FROM match WHERE liked = true ORDER BY match DESC LIMIT :limit")
Run Code Online (Sandbox Code Playgroud)

我在编译时遇到以下错误:

Error:(8, 0) Gradle: error: There is a problem with the query: [SQLITE_ERROR] SQL error or missing database (no such column: true)
Run Code Online (Sandbox Code Playgroud)

如何在查询字符串中对此布尔值进行硬编码?

我也尝试过:

  • 用单引号包装条件
    • @Query("SELECT * FROM match WHERE liked = 'true' ORDER BY match DESC LIMIT :limit")

Com*_*are 142

SQLite没有布尔数据类型.客房它映射到一个INTEGER列,映射true1false0.

所以,我希望这可行:

@Query("SELECT * FROM match WHERE liked = 1 ORDER BY match DESC LIMIT :limit")
Run Code Online (Sandbox Code Playgroud)

请记住,此行为未记录.然而,它不应该改变 - 至少不会没有警报喇叭声 - 因为我们需要使用迁移来处理任何变化.

  • @ AdamMc331:特别是在他们最近一轮的更改后,我认为Room文档中遗漏了Room文档.:-(但是,我很高兴它为你工作! (4认同)
  • 哦,是的,Room 文档非常稀少……谢谢! (2认同)

met*_*ure 15

CommonWare的方法确实有效,并且直接回答OP问题; 但是,我不喜欢对数据库做出这样的假设.假设应该是安全的,但是如果Room决定更改它的布尔实现,它可能会产生意想不到的工作.

我建议更好的方法是不将布尔值1或0硬编码到查询中.如果数据库位于存储库后面,则存储库仍可以公开优雅的API.就个人而言,我认为从数据库实现中屏蔽更大的代码库是一件好事.

道方法(复制自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>>
Run Code Online (Sandbox Code Playgroud)

知识库

class Repository {
    public Flowable<List<Match>> getLikedMatches() {
        return dao.getMatches(6, true);
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,这是一种自以为是的选择,因为它假设某种建筑风格.但是,它不会对内部数据库进行假设.即使没有存储库屏蔽数据库,也可以通过在任何地方传递true来调用数据库 - 也无需对底层数据进行假设.


d.a*_*mon 6

您不必将布尔列与值进行比较。只需将列值本身用作布尔表达式。您可以轻松地将查询更改为SELECT * FROM match WHERE liked ORDER BY match DESC LIMIT :limit. 如果要与false值进行比较,可以使用以下表达式:where not liked.