Room и ViewModel, несколько запросов? - PullRequest
0 голосов
/ 21 октября 2018

Итак, у меня есть приложение для 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());
            }
        });

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Вы можете попробовать что-то вроде этого:

 @Query("SELECT * FROM card WHERE cardFavourite OR (cardClicked >= :clicks AND cardKeyStage <= :keystage)  AND cardWord LIKE :searchWord ORDER BY cardFavourite ASC, cardClicked DESC, cardWord ASC")
    LiveData<List<Card>> searchCardListRecentsAndFavourites(String searchWord,int clicks, int keystage);
0 голосов
/ 05 ноября 2018

Еще один столбец AND с cardFavourite будет работать для вас, если второй запрос уже работает нормально.

    @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 cardFavourite AND 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);
...