Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 房间数据库中的硬编码布尔查询_Android_Android Room - Fatal编程技术网

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

我正在构建一个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>>
我在编译时遇到以下错误:

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);
          }
      }