Es ist, wie ich meine Daten mit RxJava sparen:SQLite Transaktion und 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() }
}
Und dann benutze ich diese Methode wie folgt:
notesManager.put(note)
.switchMap { notesManager.getHashtags() }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe {view.setHashtags(it) }
Und doOnUnsubscribe
nie als getHashtags()
genannt versucht, von SELECT db, die von startTransaction()
gesperrt wurde. Deadlock, heh. Okay. Lassen Sie uns doOnUnsubscribe(...)
durch doOnTerminate(...)
ersetzen.
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() }
}
Aber jetzt Transaktion nicht schließen, wenn Observable
wird durch subscriber.unsubscribe()
unterbrochen werden.
Was können Sie empfehlen, um meine Situation zu lösen?
Zusätzliche Informationen: Ich benutze eine writableDb-Instanz zum Schreiben/Lesen von Daten.
Ja, ich habe schon verstanden, dass Rx für diesen Fall nicht geeignet ist. Aber es ist zu spät, um die Architektur des Projekts zu ändern. Danke für deine Lösung. Vielleicht werde ich 'BlockingObservable' für' notesDataStore.put() 'und ähnliche Methoden verwenden. – Alexandr
Ich habe eine Bearbeitung hinzugefügt. –
Sieht interessant aus, ich werde es versuchen. Vielen Dank! – Alexandr