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