2017-07-27 2 views
0

J'ai Android la requête SQL Chambre, que coulante de retour:coulante de la chaîne à pouvant être complétée par une action

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

Dans mon dépôt, j'ai besoin obtenir l'élément émis, que de changer sa valeur booléenne, puis appelez nouvelle méthode, qui doit retours réalisables. Voilà ce que j'essaie:

@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))); 
} 

J'ai aussi essayé:

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

Mais t fonctionne pas correctement. Il semble que Flowable émet beaucoup d'éléments, et ça va se bloquer en cycle, après l'abonnement.

Répondre

0

Je ne sais pas grand-chose sur les flowables ou comment vous désabonner d'une source avec ceux-ci, mais avez-vous pensé à utiliser LiveData? Vous pouvez simplement ajouter une source à un objet LiveData, puis supprimer la connexion à la source, modifier l'objet et exécuter votre méthode sans entrer dans la boucle. Une autre idée serait que vous récupérer votre objet, garder la connexion et mettre à jour la valeur en dehors de cela. Étant donné que vous conservez la connexion à la base de données avec LiveData, l'observateur exécutera de nouveau onChanged (car la source = base de données a été modifiée). Vous devez seulement vous assurer que cette méthode renvoie par exemple null (via setValue) jusqu'à ce que la base de données télécharge la nouvelle valeur de l'objet. Si vous voulez rester avec des flux, vous devriez peut-être envisager d'ajouter une condition qui empêchera l'application de réappliquer l'entier à l'objet (et de l'envoyer à la base de données). Est-ce que cela a du sens pour vous?