Room 和 ViewModel,多个查询?

mar*_*987 4 android android-room android-livedata android-viewmodel

所以我有一个带有 Room 数据库的 Android 应用程序,这个后端由一个充当存储库的类管理,该存储库为我的视图模型提供数据,然后我的活动(片段)观察视图模型(每个人都还在我身边吗?)在我的一个片段中,我想获取数据库中点击值高于 X 的所有卡片(实体)的列表,但我也想获取所有标记为收藏夹的卡片,无论其点击值如何。

我当前的解决方案是通过我的存储库从我的视图模型运行 2 个单独的查询,并且我的活动观察这两个查询并组合返回给它的列表,这无法正常工作,因为我的列表加倍了,而且我没有当观察者在不同时间返回时清除列表的好地方,因为它们是异步的(我将发布所有代码)。

我认为我想要的是以某种方式组合查询,以便我只管理一个列表,但我的 SQL 知识不是很好,我不确定这是否可能,或者我可以以某种方式将这些列表合并到我的存储库类中但因为我正在使用实时数据,所以我不确定如何安全地获取数据来组合列表,但也许有一个我不知道的更好的解决方案,但我将在下面发布我正在做的事情

DAO 查询 这是我运行的两个查询,一个查询所有卡片被点击 x 次,另一个查询所有标记为收藏的卡片,两者都采用目前不相关的搜索字符串

@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);
Run Code Online (Sandbox Code Playgroud)

存储库我的存储库是一个充满对数据库的调用的类,这些数据库将实时数据返回到其视图模型,所需的内容是:

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);
}
Run Code Online (Sandbox Code Playgroud)

视图模型我的视图模型使用切换映射调用存储库方法(用于搜索)

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;
}
Run Code Online (Sandbox Code Playgroud)

Activity然后我的 Activity 观察到变化,正如目前提到的,这是有效的,因为它确实获取了相关数据,但它在复制数据方面不起作用,而且我没有一个明显的解决方案来清除列表欢迎完成任何想法

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());
            }
        });
Run Code Online (Sandbox Code Playgroud)

igo*_*_rb 5

你可以尝试这样的事情:

 @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);
Run Code Online (Sandbox Code Playgroud)