gpt4 book ai didi

android - 没有 LiveData 的房间

转载 作者:行者123 更新时间:2023-11-29 02:22:16 27 4
gpt4 key购买 nike

我正在试验 Room 数据库。 我不希望我的数据被观察到,我只想从数据库中取一次数据。如何使用 MVVM 实现这一目标?

我遇到的问题:如果我尝试在没有 AsyncTask 的情况下获取数据,它给出:无法访问主线程上的数据库,因为它可能会长时间锁定 UI(如预期的那样),如果我使用 AsyncTask,该方法返回 null List as 方法在 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);
}
}

View 模型:

public List<Student> getStudentWithSameName(String studentName) {
studentsWithSameName = studentRepository.getAllStudentWithSameName(studentName);
return studentsWithSameName;
}

主要 Activity :

viewModel = ViewModelProviders.of(this).get(StudentViewModel.class);
List<Student> students = viewModel.getStudentWithSameName("Bill");

最佳答案

您需要使用异步(“暂停”)函数,因为数据库调用可能需要很长时间。然后要使用结果,您必须在完成时调用一段代码,而不是立即运行它。


在我的 YourClassDao.kt更改 funsuspend fun , 和 LiveData<List<YourClass>>只是List<YourClass> :

// original: this returns a LiveData object
@Query("SELECT * FROM my_table WHERE my_field = :myId")
fun getMyObject(myId: String): LiveData<List<YourClass>>

变成:

// new: this returns a normal object
@Query("SELECT * FROM my_table WHERE my_field = :myId")
suspend fun getMyObject(myId: String): List<YourClass>

要使用数据,您需要启动一个异步作业来获取数据,然后 invokeOnCompletion使用数据所需的代码。

// using the second (suspend fun) version from above
fun useMyData() {
val database = AppDatabase.getInstance(context).YourClassDao() // context could be an activity, for example.

// start an async job to get the data
val getDataJob = GlobalScope.async { database.getMyObject("someId") }

// tell the job to invoke this code when it's done
getDataJob.invokeOnCompletion { cause ->
if (cause != null) {
// error! Handle that here
Unit
} else {
val myData = getDataJob.getCompleted()

// ITEM 1
// ***************************
// do something with your data
// ***************************

Unit // this is just because the lambda here has to return Unit
}
}

// ITEM 2 - this might happen before ITEM 1
}

关于android - 没有 LiveData 的房间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54700460/

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