My Problem is, that i need to preprocess data from the Room Database before showing it in my View.
Therefore here some Context of my Application:
Im programming a "record card" android application. Therefore i have a Room Database where all my record-cards are stored. The Information in the Entitiy is:
@Entitiy:
- ID
- Question
- Answer
- Topic
- Boxnumber (Box depends on how often i was right with my Answer)
Around the Entity i have the normal Room Setup, i found in several tutorials, with: Dao, Database, Repository
. Furthermore i have a ViewModel
connected to the Repository
. And a View
for showing the current Question connected to the ViewModel
.
My Idea:
My Idea was that the ViewModel
can hold LiveData
of all needed Cards (with a specific Topic for example).
I need some algorithm on that data which will select me my next Card i need for the View
. This depends on: How much cards have different boxnumbers, which cards was the last 10 Questions, etc.
My Problem:
In my ViewModel
i recieve LiveData
from the repository
. Every Tutorial shows only displaying the Room-Database Data with an View. But i need to do some preprocessing inside the ViewModel
. Accessing the LiveData
with .getValue()
is not working and only returning null
objects. Observing the Data in the ViewModel
is also not working, because you need an Activity
for this.
I don't know where i should place the algorithm working with the data from the database. I don't want to put it in the View
because i want to hold the current algorithm parameters inside the ViewModel
.
Some Code to understand my Program better:
@Dao
@Query("SELECT * FROM Karteikarte WHERE BoxnummerMixed = :Boxnummer")
LiveData<List<Karteikarte>> getKarteikartenInBoxMixed(int Boxnummer);
@Query("SELECT * FROM Karteikarte WHERE BoxnummerTopic = :Boxnummer AND Thema = :thema")
LiveData<List<Karteikarte>> getKarteikartenInBoxTopic(int Boxnummer, int thema);
Repository
public LiveData<List<Karteikarte>> getKarteikarteInBoxMixed(int boxnummer){
return karteikarteDao.getKarteikartenInBoxMixed(boxnummer);
}
public LiveData<List<Karteikarte>> getKarteikarteInBoxTopic(Thema thema, int boxnummer){
return karteikarteDao.getKarteikartenInBoxTopic(thema.ordinal(), boxnummer);
}
ViewModel
public LearningViewModel(Application application){
super(application);
repository = new KarteikarteRepository(application);
}
//This method will be called from the View at onCreate
public void initLearning(){
allCards = repository.getKarteikarteInBoxMixed(1);
}
//This method will be called from the View
public Karteikarte nextCard() {
// here will be a more complex algorithm
Random random = new Random();
List<Karteikarte> list = allCards.getValue();
return list.get(random.nextInt(list.size()));
}