【发布时间】:2019-07-09 01:45:54
【问题描述】:
我正在试验Room 数据库。 我不希望我的数据被观察,我只想从数据库中获取数据一次。如何使用 MVVM 实现这一点?
我面临的问题:如果我尝试在没有AsyncTask 的情况下获取数据,它会给出:
无法访问主线程上的数据库,因为它可能会长时间锁定 UI(如预期的那样),如果我使用 AsyncTask,该方法返回 null List,因为方法在 AsyncTask 完成之前返回。
道类:
@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);
}
}
视图模型:
public List<Student> getStudentWithSameName(String studentName) {
studentsWithSameName = studentRepository.getAllStudentWithSameName(studentName);
return studentsWithSameName;
}
主活动:
viewModel = ViewModelProviders.of(this).get(StudentViewModel.class);
List<Student> students = viewModel.getStudentWithSameName("Bill");
【问题讨论】:
-
请显示您如何检索列表的代码:)
-
好吧,不要在 UI 线程上获取数据,这可能会导致 ANR。
-
@Brandon 我添加了代码 sn-p 以便更好地理解。
-
谢谢@Faisal 成功了!这正是我想要的。
标签: android android-room android-livedata