Итак, у меня есть приложение для Android с базой данных Room, этот бэкэнд управляется классом, который действует как репозиторий, который питает мою модель представления, а затем моя активность (фрагмент) отслеживает модель представления (все по-прежнему со мной).?) в одном из моих фрагментов я хочу получить список всех карточек (сущностей) в моей базе данных со значением щелчка выше X, но я также хочу получить все карточки, помеченные как избранные, независимо от их значения щелчка.
Мое текущее решение выполняет 2 отдельных запроса от моей модели представления через мой репозиторий, и у меня есть активность, наблюдающая оба запроса и объединяющая возвращенные ему списки, это не работает должным образом, поскольку мои списки дублируются иУ меня нет подходящего места для очистки списков, поскольку наблюдатели возвращаются в разное время, потому что они асинхронные (я опубликую весь код).
Я думаю, что мне нужно объединить запросытак или иначе, так что я управляю только одним списком, но мои знания SQL не велики, и я неконечно, если это возможно, в качестве альтернативы я мог бы каким-то образом объединить эти списки в своем классе репозитория, но поскольку я работаю с живыми данными, я не уверен, как безопасно получить данные, чтобы объединить списки, но, возможно, есть лучшее решение, которое я 'Я не знаю, но я опубликую то, что я делаю до сих пор, ниже
Запрос DAO это два запроса, которые я выполняю, один получает все карты, кликнутые х раз, а другойполучает все карты, помеченные как избранные, обе принимают строку поиска, которая сейчас неактуальна
@Query("SELECT * FROM card WHERE cardFavourite AND cardWord LIKE :searchWord ORDER BY cardWord ASC")
LiveData<List<Card>> searchFavourites(String searchWord);
@Query("SELECT * FROM card WHERE cardClicked >= :clicks AND cardKeyStage <= :keystage AND cardWord LIKE :searchWord ORDER BY cardFavourite ASC, cardClicked DESC, cardWord ASC")
LiveData<List<Card>> searchCardListRecents(String searchWord,int clicks, int keystage);
Репозиторий Мой репозиторий - это класс, полный обращений к базе данных, которые возвращают живые данныедля их модели представления необходимы следующие:
public LiveData<List<Card>> searchFavouriteCards(String searchString){
return cardDao.searchFavourites(searchString);
}
public LiveData<List<Card>> searchRecentCards(String searchString, int clicks){
return cardDao.searchCardListRecents(searchString,clicks,keystage);
}
Модель представления моя модель представления вызывает методы хранилища с использованием карты переключателей (для поиска)
public CardFavouritesViewModel(Application application, int clicks){
cardRepository = new CardRepository(application);
search = new MutableLiveData<>();
cardRepository.getCardListByWordTypeAndWordDescription(args[0], args[1]);
favourites = Transformations.switchMap(search, mySearch -> cardRepository.searchFavouriteCards(mySearch));
recents = Transformations.switchMap(search, mySearch -> cardRepository.searchRecentCards(mySearch,clicks));
}
public LiveData<List<Card>> getLiveCardFavouriteList(){
return favourites;
}
public LiveData<List<Card>> getLiveCardRecentsList(){
return recents;
}
Активность и затем моя активность наблюдает за изменениями, как уже упоминалось, в настоящее время это работает в том смысле, что оно получает соответствующие данные, но не работает вЯ считаю, что он дублирует данные, и у меня нет очевидного решения для очистки списка, когда все сделано, приветствуются идеи
ArrayList<Card> cardArrayList = new ArrayList<>();
cardFavouritesViewModel = ViewModelProviders.of(this,
new
CardFavouritesViewModelFactory(getActivity().getApplication(),5))
.get(CardFavouritesViewModel.class);
cardFavouritesViewModel.setSearchString(mSearchString);
cardFavouritesViewModel.getLiveCardFavouriteList().observe(this,
new Observer<List<Card>>() {
@Override
public void onChanged(@Nullable List<Card> cards) {
cardArrayList.addAll(cards);
cardAdapter.refreshList(cardArrayList);
checkResults(cardArrayList.size());
}
});
cardFavouritesViewModel.getLiveCardRecentsList().observe(this,
new Observer<List<Card>>() {
@Override
public void onChanged(@Nullable List<Card> cards) {
cardArrayList.addAll(cards);
cardAdapter.refreshList(cardArrayList);
checkResults(cardArrayList.size());
}
});