当一个查询没有结果时,Room返回什么?

19

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

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

如果没有使用这个主键的任何项,会发生什么? Android Studio说DAO对象永远不会返回null。看起来当您使用Single using RxJava时才会抛出EmptyResultSetException异常,而我没有使用它。那么当ROOM找不到任何内容时会抛出什么呢?


愚蠢的问题,但为什么你不能直接运行它并找出答案呢? - a_local_nobody
2
@a_local_nobody 嗯,由于代码还处于正在进行的状态,我需要几个小时才能再次编译它。因此,如果有人知道简单的答案,现在我编码时知道会很好。 - chrisdottel
1
好的,我只是在问一下,我想运行它或为此制作一个快速的示例应用程序/单元测试会比等待答案要快得多。 - a_local_nobody
我理解的是,如果没有结果,数据库会抛出EmptyResultSetException异常。但是如果有多个结果呢?这种返回类型只能获得一个结果。最好使用列表来优雅地处理所有情况,特别是当你正在使用SELECT *查询时。 - Nicolas
从我的理解来看,只有当查询需要返回结果时,如果其返回类型类似于RxJava库中的Single,则会抛出EmptyResultSetException异常。但我在常规ROOM中没有看到它。我可以将结果转换为列表,geohash是主键。尽管它应该只有一个项目,但基于查询,列表更有意义。因此,我认为如果它是一个列表,它将返回一个空列表。我可以处理这个。 - chrisdottel
您的查询看起来完全没问题。如果您确定您的房间数据库中有数据,那么您可能对实体进行了更改,但忘记迁移。否则,由于您共享的信息不足以告诉我们问题所在,所以我们很难提供帮助,请分享更多信息,特别是调用getGeotable函数的功能。 - braop
4个回答

19
根据文档,一个无结果的查询的行为取决于声明的返回类型:
  1. fun func(foo: Foo): Bar会抛出EmptyResultSetException
  2. fun func(foo: Foo): Bar?会返回null
  3. fun func(foo: Foo): List<Bar>会返回空列表

仅从我的查询中补充一下,无论是否有结果,您的“第一”都不会发生(不会抛出异常),而在您的“第二”中,如果没有结果,则始终返回null - E.Akio
1
酷。列表从来不会为空。我的现有代码库中到处都是检查列表结果是否为空的痕迹。我会慢慢开始清除这种无意义的操作。 - steve

3

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


函数声明不可为空,应该将方法更改为 getGeoTable(geohash: String) : GeoTable? - BabyishTank

0

通过查看相应的*Dao_Impl中生成Daos代码的方式,您的Daos实现应该包含类似的内容:

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

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


-3

如果没有结果,它会简单地返回空值,什么也不会发生


4
这个答案与已发布的答案有什么不同? - Hoppeduppeanut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接