我找到了很多Room教程,但是都没有解释。
如何运行查询以返回一个对象,而不是LiveData?
我在“房间道”中有此方法:
@Dao
public interface TrainingDao {
....
Query("SELECT * FROM " + TABLE_TRAININGS + " WHERE name =:name AND open =:open")
Training fetchTrainingByName(String name, int open);
...
}
如果我在主线程上运行此方法,则应用程序崩溃,并显示错误“自...以来无法访问主线程上的数据库。”
那么,如何在返回一个训练对象的AsyncTask内运行此查询?
答案 0 :(得分:0)
如https://developer.android.com/training/data-storage/room/accessing-data所述
除非您调用allowMainThreadQueries()
,否则Room不支持主线程上的数据库访问。当您刚刚返回Training
时。您正在MainThread上运行
因此,您可以allowMainThreadQueries()
或用LiveData
包装结果,如下所示;或者,如果您喜欢RxJava,甚至可以将其包装为Flowable
或Single
>
@Dao
public interface TrainingDao {
....
Query("SELECT * FROM " + TABLE_TRAININGS + " WHERE name =:name AND open =:open")
LiveData<Training> fetchTrainingByName(String name, int open);
...
}
希望有帮助。