Room SQLite-如何使SELECT返回1个对象?

时间:2019-03-21 17:06:05

标签: java android sqlite android-room

我找到了很多Room教程,但是都没有解释。

如何运行查询以返回一个对象,而不是LiveData?

我在“房间道”中有此方法:

@Dao
public interface TrainingDao {
    ....

    Query("SELECT * FROM " + TABLE_TRAININGS + " WHERE name =:name AND open =:open")
    Training fetchTrainingByName(String name, int open);

    ...
}

如果我在主线程上运行此方法,则应用程序崩溃,并显示错误“自...以来无法访问主线程上的数据库。”

那么,如何在返回一个训练对象的AsyncTask内运行此查询?

1 个答案:

答案 0 :(得分:0)

https://developer.android.com/training/data-storage/room/accessing-data所述 除非您调用allowMainThreadQueries(),否则Room不支持主线程上的数据库访问。当您刚刚返回Training时。您正在MainThread上运行

因此,您可以allowMainThreadQueries()或用LiveData包装结果,如下所示;或者,如果您喜欢RxJava,甚至可以将其包装为FlowableSingle

@Dao
public interface TrainingDao {
    ....

    Query("SELECT * FROM " + TABLE_TRAININGS + " WHERE name =:name AND open =:open")
    LiveData<Training> fetchTrainingByName(String name, int open);

    ...
}

希望有帮助。