gpt4 book ai didi

android - Room 和 ViewModel,多个查询?

转载 作者:行者123 更新时间:2023-12-04 02:56:34 24 4
gpt4 key购买 nike

所以我有一个具有 Room 数据库的 android 应用程序,这个后端由一个类管理,该类充当为我的 View 模型提供数据的存储库,然后我的 Activity ( fragment )观察 View 模型,(每个人都和我在一起吗?)我的 fragment 之一我想获得数据库中所有卡片(实体)的列表,其点击值高于 X,但我也想获得所有标记为收藏的卡片,无论其点击值如何。

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

我想我想要以某种方式组合查询,以便我只管理一个列表,但我的 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);

存储库我的存储库是一个对数据库的调用,这些调用将实时数据返回到他们的 View 模型,为此需要的是:
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);
}

查看型号 我的 View 模型使用切换映射(用于搜索)调用存储库方法
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;
}

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

最佳答案

你可以尝试这样的事情:

 @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);

关于android - Room 和 ViewModel,多个查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52914708/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com