gpt4 book ai didi

java - 如何在android中的ViewModel中将数据从一个LiveData对象获取到另一个对象?

转载 作者:行者123 更新时间:2023-12-02 01:33:49 26 4
gpt4 key购买 nike

我正在尝试创建一个通过 room 和 LiveData 使用 SQL 数据库的应用程序。这是一个非常非常简单的测验应用程序。将显示一个问题和几个可能的答案。此外,还有一个下一个和上一个按钮可以浏览问题。

有两个表:“table_question”和“table_answer”。

table_question 由以下列组成:id、问题

table_answer:id、答案、id_question

id_question 分配问题的答案,因为它是 1:n 关系。

我从数据库中以 LiveData 对象的形式获取所有问题和所有答案的列表。另一方面,我想要一个 LiveData 类 QuizWorld 来处理屏幕上显示所需的所有数据(已回答的问题、正确回答的问题、错误回答的问题、留下的问题等)。 Activity 将观察此类,以便更新 UI。

但是我如何缩小两个 LiveData 列表“问题”和“答案”之间的差距以及 LiveData QuizWorld 的创建? QuizWorld 将需要将这些信息保存在问题和答案中,但 LiveData 对象没有构造函数。

我有使用 Transformations.switchMap 的想法,但无法实现。即使我忘记了 QuizWorld 类并在 ViewModel 中执行所有操作,也会遇到无法访问 LiveData 列表的问题。

注意:列表实际上不必是 LiveData 对象,因为 SQL 数据库在运行时不会更改。我只是不知道如何通过房间访问数据库。但如果将来数据库变得更加动态(目前尚未计划),那么它仍然是一个很好的功能。

这是部分代码:

public class MyViewModel extends AndroidViewModel{
private Repository mRepository;

private LiveData<List<Question>> questions;
private LiveData<List<Answer>> answers;

private LiveData<QuizWorld> mQuizWorld;

public MyViewModel (Application application) {
super(application);
mRepository = new Repository(application);

questions = mRepository.getQuestions;
answers = mRepository.getAnswers;

!!!!!Here should be the missing code I have no idea for!!!!!
}

public LiveData<QuizWorld> getQuizWorld(){
return mQuizWorld;
}

QuizWorld 类:

public class QuizWorld{
private List<Question> questions;
private List<Answer> answers;
private int score;

public QuizWorld(List<Question> questions, List<Answer> answers){
this.questions = questions;
this.answers = answers;

init();
}

private void init() {
//do things with the questions and answers list
}

public int getScore(){
return score;
}
}

主要 Activity :

    public class MainActivity {
private LiveData<QuizWorld> mQuizWorld;
private MyViewModel myViewModel;
private TextView tvScore;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedinstanceState);
setContenView(...);

tvScore = (TextView) findViewById(R.id.tv_Score);
myViewModel = ViewModelProvider.of(this).get(MyViewModel.class)

mQuizViewModel.getQuizWorld().observe(this, new
Observer<QuizWorld>() {

@Override
public void onChanged(QuizWorld quizWorld){
tvScore.setText(quizWorld.getScore));
//show count of questions wrongly answered
//show count of questions remaining
//...
}
}
}
}

最佳答案

我不完全确定您到底想要什么,但我宁愿建议您拥有一个包含一个问题及其答案的对象 QuestionWithAnswer,而不是两个不同的列表。然后,您可以在 dao 类中进行查询,该查询将返回 QuestionWithAnswer 类(或您的情况下的这些对象的列表)

查看此link用于查询多个表(包含用户和宠物的示例应该类似于您的)在 Dao 类中,你会看到类似这样的内容:

@Query("SELECT id as isQuestion, question, id as idAnswer, answer " +
"FROM table_question " +
"LEFT JOIN table_answer on table_question.id = table_answer.id_question")
public LiveData<List<QuestionWithAnswer>> loadResults();

另请参阅 link如果您想通过一个查询直接将对象包含在另一个对象中。

或者,你可以进行一个转换,但我认为它不会非常有效,你会执行更多的 SQL 查询,这通常对性能来说不是很好(如果你有一个小数据库,你不会注意到它) ,但对于其他具有更多数据的示例,您会这样做)。

编辑:

如果您需要转换 QuizWorld 对象中的 List,您可以使用 Transformations.map 方法,如下所示:

quizWorldLiveData = Transformations.map(questionsWithAnswersLiveData, (data) -> new QuizWorld(data))

关于java - 如何在android中的ViewModel中将数据从一个LiveData对象获取到另一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55524569/

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