Существует, как я сохранить данные с RxJava:SQLite сделки и RxJava
override fun put(note: Note): Observable<Note> {
validateNote(note)
return Observable.just(note)
.doOnNext { dbKeeper.startTransaction() }
.doOnNext { storeHashtags(note) }
.doOnNext { storeImages(note) }
.flatMap { notesDataStore.put(notesMapper.transform(note)) }
.map { notesMapper.transform(it) }
.doOnNext { dbKeeper.setTransactionSuccessful() }
.doOnUnsubscribe { dbKeeper.endTransaction() }
}
И тогда я использую этот метод, как это:
notesManager.put(note)
.switchMap { notesManager.getHashtags() }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe {view.setHashtags(it) }
И doOnUnsubscribe
никогда не называется getHashtags()
попытке выбрать из db, который заблокирован startTransaction()
. Тупик, хе. Хорошо. Давайте заменим doOnUnsubscribe(...)
на doOnTerminate(...)
.
override fun put(note: Note): Observable<Note> {
validateNote(note)
return Observable.just(note)
.doOnNext { dbKeeper.startTransaction() }
.doOnNext { storeHashtags(note) }
.doOnNext { storeImages(note) }
.map { notesMapper.transform(note) }
.flatMap { notesDataStore.put(it) }
.map { notesMapper.transform(it) }
.doOnNext { dbKeeper.setTransactionSuccessful() }
.doOnTerminate { dbKeeper.endTransaction() }
}
Но теперь сделка не закроется, если Observable
будет прервана subscriber.unsubscribe()
.
Что вы можете посоветовать для решения моей проблемы?
Дополнительная информация: Я использую один экземпляр writableDb для записи/чтения данных.
Да, я уже понял, что Rx не подходит для этого случая. Но уже слишком поздно менять архитектуру проекта. Спасибо за ваше решение. Возможно, я буду использовать 'BlockingObservable' для' notesDataStore.put() 'и подобных методов. – Alexandr
Я добавил редактирование. –
Выглядит интересно, я попробую. Благодаря! – Alexandr