预期时未引发EmptyResultSetException

时间:2019-07-09 10:37:05

标签: android-room

运行查询以一张一张一张地从表中检索记录,这些记录是电子邮件收件人。向收件人发送电子邮件后,将为收件人更新发送状态。存储此状态的表与用于存储要发送的实际消息的表有关系。因为我使用的是Room,用于检索要发送的消息的查询会自动再次运行。这将继续循环,直到已向所有收件人发送电子邮件。这适用于下面的Rx流。我的问题是,发送完最后一封电子邮件后,查询没有引发EmptyResultSetException,这是我期望在找不到更多记录时要做的事情。没有那个例外,我无法知道何时发送所有电子邮件。

val msgToSendPublisher = BehaviorSubject.createDefault(0)

msgToSendPublisher.flatMap { startPos -> App.context.repository.getMessageToSend() }
    .flatMap { messageToSend ->
        App.context.repository.sendMessage(messageToSend)
            .doOnError {
                messageToSend.failureSending = true
            }
    }
    .zipWith( // 1 second delay between emissions.
        Observable.interval(1, TimeUnit.SECONDS),
        BiFunction { item: MessageToSend, _: Long -> item })
    .flatMap { messageToSend ->
        App.context.repository.storeMessageSent(messageToSend)
            .doOnError {
                messageToSend.failureSending = true
            }
    }
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(
        { messageToSend ->

        },
        { ex ->
            if (ex is EmptyResultSetException) {

            } else {

            }
        },
        {
           // Done
        }
    )

DAO

@Query(
    "SELECT blah blah blah"
)
fun getMessageToSend(): Observable<MessageToSend>

MessageToSend.kt

class MessageToSend(
    var content: String? = null,
    var chatId: String? = null,
    var firstName: String? = null,
    var lastName: String? = null,
    var totalMessagesToSend: Int? = null
): MessageRecipientBase()

是什么能防止EmptyResultSetException被抛出?还是被扔了却被我不知道的地方抓住了。我怀疑Room仅在您明确运行查询时才抛出此异常。但是,如果由于Room强制在相关表中的数据更新后运行查询而运行查询,则Room可能会决定不引发任何异常。

注意:我在订阅者中的每个doOnError处理程序和错误处理程序上都设置了一个断点,但是没有一个命中。

2 个答案:

答案 0 :(得分:1)

仅当返回类型为AAA(s -> new A().doA(s)), BBB(s -> new B().doB(s)), CCC(s -> new C().doC(s)), DDD(s -> new D().doD(s)); 时,房间才会引发异常。

确实,文档缺乏明确的解释,但是我测试了所有情况here

根据我检查过的测试,这是一个基本摘要

    • Single ==>如果存在或引发异常不存在,将发送用户
    • Single<User> ==>将始终发送用户列表(如果不存在,则为空列表)。永远不会抛出异常
  • 也许

    • Single<List<User>> ==>将发送用户(如果存在)或仅完成(如果不存在)。不抛出任何异常
    • Maybe<User> ==>的作用类似于Maybe<List<User>>。将始终发送用户列表(如果不存在则为空列表)。永远不会抛出异常
  • 可观察(类似Flowable的作品)

    • Single<List<User>> ==>将继续监听数据库中的更改。如果有任何更新,它将发送,否则什么也不会发生。没有异常被抛出。

这些结果实际上是有道理的,但是如果文件记载得当,效果会更好

答案 1 :(得分:0)

这显然是Android文档中的一个错误。该文档指出以下内容:

  

当查询需要返回结果时(例如,在   单个查询),但是从数据库返回的结果集是   空的。

这是不正确的。应该指出,仅当返回类型为Single时才引发异常。在我的代码中,我正在返回一个Observable,并且为Room生成的代码清楚地表明,如果没有要返回的记录,则它返回null。但是,如果使用Single,它将引发异常。对于Maybe等其他类型,它也可能会引发异常,但是我没有检查是否成立。我必须修改DAO才能返回Single。