Java 如何在android的ViewModel中从一个LiveData对象到另一个LiveData对象获取数据?
我正在尝试创建一个应用程序,通过room和LiveData使用SQL数据库。这是一个非常简单的测验应用程序。将显示一个问题和两个可能的答案。此外,还有一个“下一步”和“上一步”按钮,用于浏览问题 有两个表格:“表格问题”和“表格答案” 表_问题由以下列组成:id、问题 表(答案):id,答案,id(问题) id_问题分配问题的答案,因为它是1:n关系 作为LiveData对象,我从数据库中获取所有问题和答案的列表。另一方面,我希望有一个LiveData类QuizWorld,它处理所有需要显示在屏幕上的数据(回答问题、回答正确、回答错误、回答左边等等)。活动将观察此类,以便更新UI 但我如何缩小两个LiveData列表“问题”和“答案”之间的差距,以及LiveData QuizWorld的创建?QuizWorld需要保存在问答中的信息,但LiveData对象没有构造函数 我有使用Transformations.switchMap的想法,但我无法让它工作。即使我忘记了QuizWorld类,并且在ViewModel中做了所有事情,也会给我留下一个问题,那就是我无法访问LiveData列表 注意:列表实际上不必是LiveData对象,因为SQL数据库在运行时不会更改。我只是不知道如何通过room访问数据库。但是,如果将来数据库变得更加动态,这仍然是一个很好的特性,这还没有计划好 以下是代码的一部分:Java 如何在android的ViewModel中从一个LiveData对象到另一个LiveData对象获取数据?,java,android,database,android-architecture-components,android-livedata,Java,Android,Database,Android Architecture Components,Android Livedata,我正在尝试创建一个应用程序,通过room和LiveData使用SQL数据库。这是一个非常简单的测验应用程序。将显示一个问题和两个可能的答案。此外,还有一个“下一步”和“上一步”按钮,用于浏览问题 有两个表格:“表格问题”和“表格答案” 表_问题由以下列组成:id、问题 表(答案):id,答案,id(问题) id_问题分配问题的答案,因为它是1:n关系 作为LiveData对象,我从数据库中获取所有问题和答案的列表。另一方面,我希望有一个LiveData类QuizWorld,它处理所有需要显示在屏
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;
}
公共类MyViewModel扩展了AndroidViewModel{
私有存储库;
私人生活数据问题;
私有LiveData答案;
私有LiveData mQuizWorld;
公共MyViewModel(应用程序){
超级(应用);
mRepository=新存储库(应用程序);
questions=mRepository.getQuestions;
answers=mRepository.getAnswers;
!!!!!这里应该是我不知道的缺失代码!!!!!
}
公共LiveData getQuizWorld(){
返回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;
}
}
公共类QuizWorld{
私人名单问题;
私人名单答案;
个人智力得分;
公共问答世界(列出问题,列出答案){
这个。问题=问题;
这个。答案=答案;
init();
}
私有void init(){
//根据问题和答案列表进行操作
}
公共整数getScore(){
返回分数;
}
}
主要活动:
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
//...
}
}
}
}
公共类活动{
私有LiveData mQuizWorld;
私有MyViewModel MyViewModel;
私有文本视图tvScore;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedinstanceState);
setContenView(…);
tvScore=(TextView)findViewById(R.id.tv_分数);
myViewModel=ViewModelProvider.of(this.get)(myViewModel.class)
mQuizViewModel.getQuizWorld().observe(这个,新的
观察员(){
@凌驾
更改后的公共无效(QuizWorld QuizWorld){
setText(quizWorld.getScore));
//显示错误回答的问题数
//显示剩余问题数
//...
}
}
}
}
我不能完全确定您到底想要什么,但我建议您使用一个包含一个问题及其答案的ObjectQuestionWithAnswer,而不是两个不同的列表。然后,您可以在dao类中进行查询,谁将返回QuestionWithAnswer类(或您案例中的这些对象列表)
有关查询多个表的信息,请参见此内容(包含user和pet的示例应该与您的类似)
在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();
好的,听起来不错,但并不能解决我的问题。现在我的ViewModel中只有一个LiveData。我如何将此列表转移到我的LiveData?指定我的问题。我们只讨论ViewModel代码:我有一个来自SQL(Room)的LiveData对象数据库。另一方面,我在ViewModel中创建了一个LiveData。QuizModel的工作需要列表。QuizWorld如何从LiveData中获取数据?是否有任何转换解决方案?我更新了我的答案。请注意,您可以在map方法中提供的函数中执行任何操作。您可能需要添加curvy b竞相添加额外的行,例如:(数据)->{…用一些代码行替换它…}
quizWorldLiveData = Transformations.map(questionsWithAnswersLiveData, (data) -> new QuizWorld(data))