2017-07-27 4 views
0

Ich habe Android Zimmer der SQL-Abfrage, die Rückkehr fließfähig:Kette fließfähig komplettierbar mit Wirkung

@Query("SELECT * FROM exercices WHERE lang = 'ru' AND id_exercice = :id") 
Flowable<Exercices> getExercicesById(int id); 

In meinem Repository, ich brauche emittiert Element zu erhalten, als sein boolean Wert ändern, dann neue Methode aufrufen, das muss kehrt vollständig zurück. Das ist, was ich versuche:

@Override 
public Completable setExerciseUsed(int id) { 
    return mDatabase.exerciseDao().getExercicesById(id) 
      .doOnNext(exercise -> exercise.setIs_used(1)) 
      .flatMapCompletable(exercise -> 
        Completable.fromAction(() -> mFitnessDatabase.exerciseDao().addExercise(exercise))); 
} 

Auch habe ich versucht:

Exercices e = mDatabase.exerciseDao().getExercicesById(id).blockingFirst(); 
    e.setIs_used(0); 
    return Completable.fromAction(() -> mDatabase.exerciseDao().addExercise(e)); 

Aber t funktioniert nicht richtig. Es scheint, als würde es fließend viele Elemente aussenden, und es wird nach dem Abonnement im Zyklus hängen bleiben.

Antwort

0

Ich weiß nicht viel über Flowables oder das Abmelden von einer Quelle mit denen, aber haben Sie über LiveData nachgedacht? Sie können einem LiveData-Objekt einfach eine Quelle hinzufügen, dann die Verbindung zur Quelle entfernen, das Objekt ändern und Ihre Methode ausführen, ohne in eine Schleife zu wechseln.

Eine andere Idee wäre, dass Sie Ihr Objekt abrufen, die Verbindung beibehalten und den Wert außerhalb davon aktualisieren. Da Sie die Datenbankverbindung mit LiveData beibehalten, führt der Beobachter den onChanged erneut aus (weil die Quelle = Datenbank geändert wurde). Sie müssen nur sicherstellen, dass diese Methode beispielsweise null (über setValue) zurückgibt, bis die Datenbank den neuen Objektwert hochgeladen hat.

Wenn Sie bei Flowables bleiben möchten, sollten Sie möglicherweise eine Bedingung hinzufügen, die verhindert, dass die App die Ganzzahl erneut auf das Objekt anwendet (und an die Datenbank sendet). Macht das für Sie Sinn?