【问题标题】:What does Room return if a query had no results如果查询没有结果,Room 会返回什么
【发布时间】:2020-12-22 12:53:18
【问题描述】:

很难找到这个答案,文档似乎没有回答这个问题。 如果我有一个基本的 ROOM 查询,

@Query("SELECT * FROM geotable WHERE geohash = :geohash")
abstract suspend fun getGeoTable(geohash: String) : GeoTable

并且没有这样的项目使用这个主键,会发生什么? Android Studio 说 DAO 对象永远不会返回 null。似乎 EmptyResultSetException 仅在您使用我不使用的 RxJava 使用 Single 时才被抛出。那么当普通的 old ROOM 一无所获时,它会抛出什么?

【问题讨论】:

  • 无知的问题,但你为什么不能直接运行它并找出答案?
  • @a_local_nobody 好吧,我要过几个小时才能让代码再次编译,因为它处于工作进行中状态。因此,如果有人有简单的答案,很高兴知道我现在正在编码。
  • 很公平,我只是在问,我认为只是运行它或为此进行快速示例应用程序/单元测试会快得多,而不必在这里等待答案
  • 我的理解是如果没有结果数据库会抛出EmptyResultSetException。但是如果有多个结果呢?你只会得到一个具有这种返回类型的。最好使用列表来优雅地处理所有情况,特别是因为您正在做SELECT *
  • @Nicolas 据我了解, EmptyResultSetException 仅引发查询需要返回结果,如果它的返回类型类似于 RxJava 库中的 Single 。但我没有看到它的普通房间。我可以把结果变成一个列表,geohash 是一个主键。即使它应该只是一个项目,但基于查询,列表会更有意义。所以我假设如果它是一个列表,它将返回一个空列表。我可以使用它。

标签: android sqlite android-room


【解决方案1】:

如果根据您的条件没有找到任何内容,它将返回 null。

【讨论】:

  • 函数声明不可为空,如果OP改变方法为getGeoTable(geohash: String) : GeoTable?
【解决方案2】:

如果没有结果 它什么都不返回 什么都没有发生

【讨论】:

  • 这个答案与已经发布的答案有何不同?
【解决方案3】:

通过查看在各个 *Dao_Impl 中如何生成 Daos 代码,您的 Daos 实现应该包含类似的内容:-

final GeoTable result;
if(_cursor.moveToFirst()) {
   ....
}else {
    _result = null;
    }
return _result;
}

所以如果游标结果集中没有记录,_cursor.moveToFirst() 应该返回 false 并最终导致返回 null。

【讨论】:

    【解决方案4】:

    基于documentation,无结果查询的行为由声明的返回类型定义:

    1. fun func(foo: Foo): Bar 会抛出 EmptyResultSetException
    2. fun func(foo: Foo): Bar? 将返回 null
    3. fun func(foo: Foo): List<Bar> 将返回一个空列表

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      • 2021-12-09
      • 2016-08-22
      • 2015-02-25
      相关资源
      最近更新 更多