Моя проблема в том, что мне нужно предварительно обработать данные из базы данных комнат, прежде чем показывать их в моем представлении.
Поэтому вот некоторый контекст моего приложения:
Я программирую приложение для Android с «карточкой записи». Поэтому у меня есть База данных комнат, где хранятся все мои записи. Информация в организации:
@Entitiy:
- ID
- Question
- Answer
- Topic
- Boxnumber (Box depends on how often i was right with my Answer)
Вокруг сущности у меня есть обычная настройка комнаты, я нашел в нескольких уроках: Dao, Database, Repository
. Кроме того, у меня есть ViewModel
, связанный с Repository
. И View
для отображения текущего Вопроса, подключенного к ViewModel
.
Моя идея:
Моя идея состояла в том, что ViewModel
может содержать LiveData
всех необходимых карт (например, с определенной темой).
Мне нужен алгоритм для этих данных, который выберет мне мою следующую карту, которая мне нужна для View
. Это зависит от того: сколько карт имеют разные номера ящиков, какие карты были последними 10 вопросами и т. Д.
Моя проблема:
В моем ViewModel
я получаю LiveData
от repository
. Каждый учебник показывает только отображение данных базы данных комнаты с представлением. Но мне нужно сделать некоторую предварительную обработку внутри ViewModel
. Доступ к LiveData
с помощью .getValue()
не работает и возвращает только null
объекты. Наблюдение за данными в ViewModel
также не работает, потому что для этого вам нужен Activity
.
Я не знаю, куда мне поместить алгоритм работы с данными из базы данных. Я не хочу помещать его в View
, потому что я хочу хранить текущие параметры алгоритма внутри ViewModel
.
Код для лучшего понимания моей Программы:
@ 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);
Репозиторий
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()));
}