Wie beobachtet man LiveData im Repository vom ViewModel aus? (room, Android architecture components)

T

TestPilot1987

Neues Mitglied
Threadstarter
Moin,

ich muss gestehen, dass ich ein ähnliches Thema bereits unter https://stackoverflow.com/questions/55484682/how-to-use-room-and-databases-without-livedata-in-android eröffnet habe. Allerdings hat mir das noch nicht so recht geholfen. Ggf. kann ich auf Deutsch mein Problem besser und präziser beschreiben.

Folgendes Problem: Man stelle sich eine App vor, die aus einer TextView und zwei Buttons "weiter" und "zurück" besteht. Darüber hinaus verfügt die App über eine SQL Datenbank, die eine Liste an Wörtern enthält (Eine Spalte "ID" und eine "word"). Ziel der App ist es nun, dem Benutzer die einzelnen Einträge der SQL Datenbank darzustellen, sprich zu Beginn wird dem Nutzer das Wort, welches in der ersten Zeile der Datenbank steht, in der Textview angezeigt, mit einem Klick auf "weiter" das Zweite usw. Man kann also durch die einzelnen Zeilen der Datenbank navigieren.

Umsetzung: Ich habe die Klassen MainActivity, ViewModel, Repository und eine Schnittstelle DAO. Das Beispiel für Room von Google, an dem ich mich orientiert habe, ist ähnlich aufgebaut.
Ich könnte jetzt ein LiveData Objekt, welches zum Beispiel eine Liste alle Wörter der Datenbank enthält, in meiner MainAcitivity beobachten ("observe"). Dafür müsste ich dann die entsprechende
"onChange" Methode überschreiben. Ich würde entsprechend eine List<String> words erhalten. In meiner Activity könnte ich einen Index einführen, der mit der entsprechenden Logik über die Buttons erhöht oder erniedrigt wird und über words.get(index) in der TextView angezeigt wird.

Problem: Streng genommen widerspricht dies dem Konzept, dass die Daten im ViewModel getrennt von der UI (Activity) verarbeitet werden.
Also könnte man im ViewModel eine Instanz einer neu erstellten Klasse WordsManager als LiveData estellen. Diese Klasse enthält die List<String> words und den Index. Nun beobachtet man WordsManager in der Activity. Mit den Buttons erhöht oder erniedrigt man den Index in WordsManager und löst damit das entsprechende onChange Ereignis aus, welches dann die UI aktualisiert. Nun wäre der Code sauber getrennt. Problematisch ist aber nun, dass ich aus meinem ViewModel nun das Respository beobachten müsste, um die List<String> words zu erhalten und damit meinen WordsManager zu initialisieren. Das geht aber nicht.

Frage: Wie kann ich LiveData im Repository vom ViewModel aus beobachten?

Lösungsansatz: Ich habe einen Artikel im Netz gefunden, der die Verwendung von transformations.switchMap empfiehlt, allerdings verstehe ich das nicht. (Unter der Überschrift "LiveData in Repositories": ViewModels and LiveData: Patterns + AntiPatterns)

Kann mir jemand Licht ins Dunkel bringen?
 
Oben Unten