gpt4 book ai didi

android - MVVM体系结构中的ViewModel操作

转载 作者:行者123 更新时间:2023-12-03 10:22:17 27 4
gpt4 key购买 nike

我的问题是,我需要先对 session 室数据库中的数据进行预处理,然后才能在 View 中显示。

因此,这里是我的应用程序的上下文:

我正在编写“记录卡” 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的当前Question。

我的主意:

我的想法是 ViewModel可以保存所有需要的卡片的 LiveData(例如,带有特定主题)。
我需要针对该数据的某种算法,该算法将选择 View所需的下一张卡片。这取决于:多少张卡具有不同的箱号,哪些卡是最近的10个问题,等等。

我的问题:

在我的 ViewModel中,我从 LiveData接收 repository。每个教程仅显示带有 View 的Room-Database数据。但是我需要在 ViewModel内部做一些预处理。使用 LiveData访问 .getValue()不起作用,仅返回 null对象。观察 ViewModel中的数据也不起作用,因为为此您需要一个 Activity

我不知道我应该将算法与数据库中的数据一起放置在哪里。我不想将其放在 View中,因为我想在 ViewModel中保存当前算法参数。

一些代码可以更好地理解我的程序:

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

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

最佳答案

在这里我用了Transformations.switchMap()Transformations.map()

要详细了解Transformations和MediatorLiveData,可以观看 Android Dev Summit '18上的此视频-Fun with LiveData

private MutableLiveData<Integer> boxNumberLiveData = new MutableLiveData<>();
private final LiveData<List<Karteikarte>> allCardsLiveData;

//Observe this from Fragment or Activity
public final LiveData<Karteikarte> karteikarteLiveData;

LearningViewModel(){

// when ever you change box number below function is called and list of Karteikarte will be updated
allCardsLiveData = Transformations.switchMap(boxNumberLiveData, new Function<Integer, LiveData<List<Karteikarte>>>() {
@Override
public LiveData<List<Karteikarte>> apply(Integer number) {
if(number == null)return null;
return repository.getKarteikarteInBoxMixed(1);
}
});

// when ever list of Karteikarte is changed, below function will be called and a random Karteikarte will be selected
karteikarteLiveData = Transformations.map(allCardsLiveData, new Function<List<Karteikarte>, Karteikarte>() {
@Override
public Karteikarte apply(List<Karteikarte> list) {
return getRandomKarteikarte(list);
}
});

}

public void initLearning(){
//Enter box number here
// you can modify box number anytime you want, everything will change respectively
boxNumberLiveData.setValue(1);
}


private Karteikarte getRandomKarteikarte(@Nullable List<Karteikarte> list){
if(list == null)return null;
Random random = new Random();
return list.get(random.nextInt(list.size()));
}

如果您想获得下一个随机的Karteikarte。最好的实现方法是在数据库中有一个额外的字段。
@Entitiy:
- ID
- Question
- Answer
- Topic
- Boxnumber (Box depends on how often i was right with my Answer)
- isShown(boolean)

在查询数据时,您需要添加 isShown is false的额外条件
因此,当您要加载下一个Karteikarte时,只需将当前Karteikarte的isShown字段更新为true

如果要重新使用已经显示的Karteikarte,则可以在开始过程时将isShown值重置为false

关于android - MVVM体系结构中的ViewModel操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53261887/

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