Способы создания слоя абстракции поверх активной базы данных? - PullRequest
0 голосов
/ 14 октября 2019

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

Текущей целевой базой данных является Realm, и заманчиво просто сослаться на них в моих классах DAO, которые общаются с моими классами репозитория. Однако, после некоторых размышлений, мне, вероятно, следует создать слой абстракции поверх DAO, чтобы у меня не было сильной зависимости от Realm. В этом случае он будет более или менее перенаправлять входы и выходы Царства. Тем не менее, я вижу, где я могу попытаться сделать стандартную базу данных sqlite реактивной.

Но прежде чем идти по этому пути, мне было интересно, есть ли лучшие альтернативы от людей, которые имеют опыт в этой теме.

1 Ответ

0 голосов
/ 18 октября 2019

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

Вам нужна общая абстракция, котораяпредставляет последнее значение выбросов нескольких событий.

Потенциальные кандидаты: io.reactivex.Observable<T> или LiveData<T>.

Текущая целевая база данных - Realm, и соблазнительно просто сослаться на них вмои классы DAO, которые общаются с моими классами репозитория.

Заманчиво, пока вы не поймете, что экземпляр Realm является локальным для потоков и подсчитывает ссылки, поэтому если вы это сделаете, вы не сможете узнать, когда закрывать Царство (если тольковы передаете Realm каждому из ваших dao.find*( методов или сами создаете ThreadLocal<Realm>, чтобы вы могли отслеживать, когда его закрывать.)

В этом случае он будетбыть более или менее перенаправлять входы и выходы Царства. Тем не менее, я вижу, где можно попытаться сделать стандартную базу данных sqlite реактивной .

Хотя Room и SqlDelight предоставляют поддержку для этого, вы можете посмотреть в thisрепо о том, как вы можете создать простую оболочку для SQLite самостоятельно.

Но прежде чем идти по этому пути, мне было интересно, есть ли лучшие альтернативы от людей, которые имеют опыт вэтот предмет.

Если вы хотите сделать Царство "независимым от Царства" и доступным для наблюдений, не полагаясь на его ленивую оценку, вы можете поместить Царство в фоновый поток петлителя (HandlerThread)из которого вы отображаете элементы при обнаружении изменений.

Эти RealmResults в этом фоновом потоке петлителя должны храниться в наборе, чтобы сохранять сильную ссылку на них, чтобы сохранить возможность прослушивать изменения.

Если вы перестанете наблюдать ВСЕ RealmResults, которые вы открыли, то вы, возможно, захотите закрыть Королевство автоматически.

Хотя я больше не касаюсь проекта, вы можете взглянуть на Realm-Monarchy (мной), который делает именно то, что я упомянул выше: оберните RealmResults в LiveData<List<T>>, чтобы он мог бытьпоменялись местами с чем-либо еще (включая, например, Room). Вы можете побаловаться его исходным кодом, если хотите.

...