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