Android 房间数据库中的硬编码布尔查询
我正在构建一个Android应用程序,为用户显示可能匹配的列表。用户可以单击其中一个来喜欢该用户,我将所有喜欢的内容都保存在本地 我可以编写一个查询来获取匹配列表,如下所示:Android 房间数据库中的硬编码布尔查询,android,android-room,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<Mat
@Query("SELECT * FROM match WHERE liked = :liked ORDER BY match DESC LIMIT :limit")
fun getMatches(limit: Int = 6, liked: Boolean = true): Flowable<List<Match>>
我在编译时遇到以下错误:
Error:(8, 0) Gradle: error: There is a problem with the query: [SQLITE_ERROR] SQL error or missing database (no such column: true)
如何在查询字符串中硬编码此布尔值
我也尝试过:
- 将条件用单引号括起来
@Query(“从喜欢的匹配项中选择*='true'按匹配顺序描述限制:限制”)
- SQLite没有布尔数据类型。房间将其映射到一个
INTEGER
列,将true
映射到1
和false
映射到0
因此,我希望这能奏效:
@Query("SELECT * FROM match WHERE liked = 1 ORDER BY match DESC LIMIT :limit")
请记住,此行为是未记录的。然而,它不应该改变——至少在没有klaxons发出警报的情况下不会改变——因为我们需要使用迁移来处理任何变化。CommonWare的方法确实有效,而且还直接回答了OPs问题;然而,我不喜欢对数据库做出这样的假设。这个假设应该是安全的,但如果Room决定更改它的布尔实现,它可能会在将来产生意想不到的工作 我建议更好的方法是不要将布尔值1或0硬编码到查询中。如果数据库位于存储库后面,存储库仍然可以公开一个优雅的API。就我个人而言,我认为从数据库实现中屏蔽较大的代码库是一件好事 Dao方法(摘自OP的问题)
@Query(“从匹配中选择*,其中喜欢=:喜欢的顺序按匹配描述限制:限制”)
fun-getMatches(limit:Int=6,liked:Boolean=true):可流动
存储库
class Repository {
public Flowable<List<Match>> getLikedMatches() {
return dao.getMatches(6, true);
}
}
类存储库{
公共可流动getLikedMatches(){
return dao.getMatches(6,true);
}
}
当然,这是一个固执己见的选择,因为它采用了某种架构风格。但是,它不会对内部数据库进行假设。即使没有存储库对数据库进行屏蔽,也可以通过到处传递true来调用数据库,也无需对底层数据进行假设。您不必将布尔列与值进行比较。只需将列值本身用作布尔表达式即可。您可以轻松地将查询更改为
SELECT*FROM match WHERE liked ORDER BY match DESC LIMIT:LIMIT
。
如果要与
false
值进行比较,可以使用以下表达式:where not liked
有效,谢谢!我肯定认为文件室文档中遗漏了这一点。@AdamMc331:特别是在他们最近一轮更改之后,我认为文件室文档中遗漏了文件室文档-(但是,我很高兴它能为您工作!好吧,我做到了这一点!:是的,文件室文档非常稀少…谢谢!文件室数据库显然生成了1个为真1个为假购买我的查询返回空列表或空列表。可能是什么问题?如果您使用不同的体系结构样式。您可以直接在DAO定义。但是您需要将DAO定义为一个抽象类,而不是一个接口。与上面的定义相同:@Query(“SELECT*FROM match WHERE liked=:liked ORDER BY match DESC LIMIT:LIMIT”)受保护的抽象fun getMatches(LIMIT:Int,liked:Boolean):可流动的
和公共版本fun getliked matches(limit:Int=6)=getMatches(limit,true)
“如果Room决定更改其布尔实现”-他们不能这样做,因为每个人在升级Room时都会“损坏”现有的布尔数据。我从未见过Room库更改的数据迁移逻辑。“他们不能这样做”-他们可以。他们可能做得很慢,但他们绝对可以。依赖Room的底层实现可能会很危险。因为有些东西被暴露出来并没有足够的理由使用它-特别是当通过记录行为可以获得相同的目的时。“他们可以”但这将是一个bug。我也可以编写bug,但令人惊讶的是,没有人喜欢这样。
@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);
}
}