Я экспериментирую с базой данных Room
. Я не хочу, чтобы мои данные наблюдались, я просто хочу получить данные из базы данных один раз .Как добиться этого с помощью MVVM?
Проблема, с которой я столкнулся: Если я пытаюсь получить данные без AsyncTask
, это дает: Невозможно получить доступ к базе данных в главном потоке, поскольку потенциально может заблокировать пользовательский интерфейс на длительный периодвремени (как и ожидалось), и если я использую AsyncTask
, метод возвращает ноль List
, поскольку метод возвращает до завершения AsyncTask
.
Класс Dao:
@Query("SELECT * FROM student_table where StudentName = :studentName")List<Student> getStudentWithSameName(String studentName);
Репозиторий:
public List<Student> getAllStudentWithSameName(String studentName) {
new GetAllStudentWithSameNameAsyncTask(studentDao).execute(studentName);
return studentsWithSameName;
}
private class GetAllStudentWithSameNameAsyncTask extends AsyncTask< String,Void, List<Student> > {
StudentDao studentDao;
public GetAllStudentWithSameNameAsyncTask(StudentDao studentDao) {
this.studentDao = studentDao;
}
@Override
protected List<Student> doInBackground(String... strings) {
List<Student> students = studentDao.getStudentWithSameName(strings[0]);
return students;
}
@Override
protected void onPostExecute(List<Student> students) {
studentsWithSameName = students;
super.onPostExecute(students);
}
}
ViewModel:
public List<Student> getStudentWithSameName(String studentName) {
studentsWithSameName = studentRepository.getAllStudentWithSameName(studentName);
return studentsWithSameName;
}
MainActivity:
viewModel = ViewModelProviders.of(this).get(StudentViewModel.class);
List<Student> students = viewModel.getStudentWithSameName("Bill");