Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在android的ViewModel中从一个LiveData对象到另一个LiveData对象获取数据?_Java_Android_Database_Android Architecture Components_Android Livedata - Fatal编程技术网

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

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,它处理所有需要显示在屏

我正在尝试创建一个应用程序,通过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访问数据库。但是,如果将来数据库变得更加动态,这仍然是一个很好的特性,这还没有计划好

以下是代码的一部分:

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