EmptyResultSetException не генерируется, когда ожидается - PullRequest
0 голосов
/ 09 июля 2019

Запускается запрос для извлечения записей из таблицы один за другим, которые являются получателями электронной почты. После отправки электронного письма получателю, статус отправки обновляется для получателя. Таблица, в которой хранится этот статус, связана с таблицей, используемой для хранения фактических сообщений, подлежащих отправке. Поскольку я использую 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 ]

1 голос
/ 11 июля 2019

Комната выдаст исключение только тогда, когда типом возврата будет Single.

Действительно, в документации нет четкого объяснения, но я проверил все случаи здесь

Из тестов, которые я проверил, вот основное резюме

  • Single

    • Single<User> ==> отправит пользователя, если существует или создает исключение не существует
    • Single<List<User>> ==> всегда будет отправлять список пользователей (пустой список, если не существует). Никогда не выдает исключение
  • Может быть

    • Maybe<User> ==> отправит пользователя, если он существует, или просто завершит запрос, если нет. Не бросает никаких исключений
    • Maybe<List<User>> ==> работает как Single<List<User>>. Всегда будет отправлять список пользователей (пустой список, если не существует). Никогда не выдает исключение
  • Observable (Flowable работает аналогично)

    • Observable<User>, Observable<List<User>> ==> продолжит прослушивать изменения в базе данных. Если что-то обновится, оно отправит, иначе ничего не произойдет. Не исключение не выбрасывается.

Эти результаты действительно имеют смысл, но было бы лучше, если бы они хорошо документировали

0 голосов
/ 09 июля 2019

Это ясно, ошибка в документации Android.В документации говорится следующее:

Брошено по комнате, когда запрос должен вернуть результат (например, в одиночном запросе), но возвращенный набор результатов из базы данных пуст.

Это неверно.Должно быть написано, что исключение выдается ТОЛЬКО, когда типом возврата является Single.В моем коде я возвращал Observable, и сгенерированный код для Room ясно показывает, что он возвращает ноль, если нет записей для возврата.Но это вызовет исключение, если используется Single.Это может также вызвать исключение для других типов, таких как Maybe, но я не проверял, правда ли это.Мне пришлось изменить свой DAO, чтобы вернуть Single.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...