运行查询以一张一张一张地从表中检索记录,这些记录是电子邮件收件人。向收件人发送电子邮件后,将为收件人更新发送状态。存储此状态的表与用于存储要发送的实际消息的表有关系。因为我使用的是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处理程序和错误处理程序上都设置了一个断点,但是没有一个命中。
答案 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>>
。将始终发送用户列表(如果不存在则为空列表)。永远不会抛出异常Single<List<User>>
==>将继续监听数据库中的更改。如果有任何更新,它将发送,否则什么也不会发生。没有异常被抛出。 这些结果实际上是有道理的,但是如果文件记载得当,效果会更好
答案 1 :(得分:0)
这显然是Android文档中的一个错误。该文档指出以下内容:
当查询需要返回结果时(例如,在 单个查询),但是从数据库返回的结果集是 空的。
这是不正确的。应该指出,仅当返回类型为Single时才引发异常。在我的代码中,我正在返回一个Observable,并且为Room生成的代码清楚地表明,如果没有要返回的记录,则它返回null。但是,如果使用Single,它将引发异常。对于Maybe等其他类型,它也可能会引发异常,但是我没有检查是否成立。我必须修改DAO才能返回Single。