Комментарии 12
Немного пройдусь по поддержке Rx, если вы не против :)
Например, для метода интерфейса ResultSet getAllRecords(); из примера выше будет сгенерирован следующий метод-обертка:
public rx.Observable<com.qwert2603.retrobase_example.DataBaseRecord> getAllRecords() {
return Observable.create(subscriber -> {
try {
ResultSet resultSet = mDB.getAllRecords();
while (resultSet.next()) {
subscriber.onNext(new com.qwert2603.retrobase_example.DataBaseRecord(resultSet));
}
subscriber.onCompleted();
}
catch (Exception e) {
subscriber.onError(e);
}
} );
}
Тут 3 проблемы:
- Не надо использовать
Observable.create()
в RxJava v1, а если используете, будьте очень осторожны. В user-space коде используйтеObservable.fromEmitter()
, в библиотеках используйте его после того, как он выйдет из@Experimental
. В RxJava v2Observable.create()
норм. - Вообще не проверяется
subscriber.isUnsubscribed()
— соответсвенно,Observable
будет работать до конца, даже после отписки подписчика. Лучше добавить проверку прямо в циклwhile(!subscriber.isUnsubscribed() && …)
и перед каждым вызовомonNext/onCompleted/onError
. - Нет обработки backpressure, а в IO операциях, таких как работа с БД — это неизбежно.
Вообще судя по статье, Rx здесь прикручен постольку-поскольку и реактивную БД оно здесь явно не делает, тк на изменения, произошедшие в БД, новых данных просто так подписчикам не придёт, что, конечно, не сводит смысл от поддержки Rx в ноль, но всё же убирает важную часть реактивности.
Реактивность была и правда добавлена для возможности выполнять запросы в фоне и применять rx-операторы к результатам.
Ну вы же понимаете, что как только появляется Android клиент, ваша база больше не шифрована? Это всё равно что полагаться на честное слово пользователя — но тогда и шифровать ничего не нужно…
Ну и получается, что у вашего приложения был доступ в сеть — и чтобы нормально отслеживать распространение базы, правильно было бы, чтобы оно делало запросы к некоему серверу, который бы перед передачей данных проверял, не ушла ли информация на сторону… Так что такая реализация имхо не очень корректна.
RetroBase — аналог Retrofit для запросов к базам данных