【发布时间】:2021-01-31 07:43:15
【问题描述】:
一切正常(使用 AsyncTask 插入、更新、删除),但通过 id 获取单行不是...
主要问题是有两个Activity。
- RecyclerView
- 详情页
单击 RecyclerView 列表项后,我想通过 id 从数据库中获取一项。 如果我使用 LiveData 获取它,我无法将它与 UI 线程中的变量同步。
如何从数据库中获取单行?
在我拥有的 DAO 中:
@Query("SELECT * FROM codes WHERE id = :id")
Code getCodeById(int id);
在存储库中:
public Code retrieveCode(int id){
return myDatabase.getCodeDao().getCodeById(id);
}
如果我写在主线程中
selectedCode = mCodeRepository.retrieveCode(codeId);
它给出了一个错误:
Caused by: java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
我应该使用 AsyncTask,但如何使用?
【问题讨论】:
-
“我应该使用 AsyncTask”——不。 “如何从数据库中获取单行?” -- 你已经有了代码。所有数据库操作都需要在后台线程上执行。对于 Java 中的查询,典型的方法是让 DAO 返回
LiveData或 RxJava 类型(例如,Single、Observable)。 “如果我使用 LiveData 获得它,我无法将它与 UI 线程中的变量同步”——您可能想问一个单独的问题,您可以在其中提供 minimal reproducible example 显示您为此尝试过的内容。 -
我这里有一个小例子:stackoverflow.com/questions/64396258/…
标签: java android android-room