Pull to refresh

Comments 12

UFO just landed and posted this here
UFO just landed and posted this here

Немного пройдусь по поддержке 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 v2 Observable.create() норм.
  • Вообще не проверяется subscriber.isUnsubscribed() — соответсвенно, Observable будет работать до конца, даже после отписки подписчика. Лучше добавить проверку прямо в цикл while(!subscriber.isUnsubscribed() && …) и перед каждым вызовом onNext/onCompleted/onError.
  • Нет обработки backpressure, а в IO операциях, таких как работа с БД — это неизбежно.

Вообще судя по статье, Rx здесь прикручен постольку-поскольку и реактивную БД оно здесь явно не делает, тк на изменения, произошедшие в БД, новых данных просто так подписчикам не придёт, что, конечно, не сводит смысл от поддержки Rx в ноль, но всё же убирает важную часть реактивности.

По поводу 2 проблемы — исправить несложно. Сегодня вечером будет лучше. 3 проблему тоже можно исправить.
Реактивность была и правда добавлена для возможности выполнять запросы в фоне и применять rx-операторы к результатам.
Мне кажется проблему backpressure библиотека не должна решать. Это должен делать пользователь библиотеки. Потому что как минимум не один вариант можно выбрать.

Проблема в том, что код выше просто не поддерживает backpressure и, соответственно, не даст пользователю библиотеки правильно её обработать.

Неужели есть Android приложения, которые работают напрямую с базой данных? По-моему, это какой-то уникальный и из ряда вон выходящий случай.
Действительно, таких очень немного. Одно я делал для себя для домашнего использования, поэтому и появилась идея для этой библиотеки. При этом сам инструмент Annotation Processing может быть полезен во многих других областях.
Был как-то опыт создания такого приложения. Грубо говоря, оно являлось интерфейсом для БД. Суть была в том, что клиент грузил шифрованную БД и в удобном виде представлял ее пользователю. Приложение было для фармакологической компании, и соответственно бдшка содержала всю инфу по препаратам. Так что да, такие приложения есть.

Ну вы же понимаете, что как только появляется Android клиент, ваша база больше не шифрована? Это всё равно что полагаться на честное слово пользователя — но тогда и шифровать ничего не нужно…
Ну и получается, что у вашего приложения был доступ в сеть — и чтобы нормально отслеживать распространение базы, правильно было бы, чтобы оно делало запросы к некоему серверу, который бы перед передачей данных проверял, не ушла ли информация на сторону… Так что такая реализация имхо не очень корректна.

На тот момент заказчик хотел, чтобы все было именно так. Я то конечно понимаю, но вот заказчику это объяснить не получалось. В общем, пришлось сделать так, как сделали. А так по идее я бы сделал некий механизм завязанный на первичных ключах, например, генерацию токена по device_model и user_id. Таким образом взломщику пришлось бы хотя-бы подольше ломать все это, и, возможно, ему бы просто надоело.
Sign up to leave a comment.

Articles