Android 房间-何时初始化数据库以及如何通过应用程序生命周期访问数据库

Android 房间-何时初始化数据库以及如何通过应用程序生命周期访问数据库,android,sqlite,android-room,Android,Sqlite,Android Room,我试图将其设置为一种简化对SQLite数据库访问的方法。我已经编写了一些代码,但无法运行,因为应用程序会引发以下异常: 无法访问主线程上的数据库,因为它可能会长时间锁定UI 我做了一些研究,发现在databaseBuilder中.allowMainThreadQueries(),这似乎是一个糟糕的解决方案,因为它就像静音错误消息,而不是修复真正的原因 那么,什么是最佳实践?我应该在什么时候(应用程序生命周期内)创建数据库,并将其存储在哪里,以便我可以从任何我想要的活动中访问它 我应该在什么时候(

我试图将其设置为一种简化对SQLite数据库访问的方法。我已经编写了一些代码,但无法运行,因为应用程序会引发以下异常:

无法访问主线程上的数据库,因为它可能会长时间锁定UI

我做了一些研究,发现在
databaseBuilder
.allowMainThreadQueries()
,这似乎是一个糟糕的解决方案,因为它就像静音错误消息,而不是修复真正的原因

那么,什么是最佳实践?我应该在什么时候(应用程序生命周期内)创建数据库,并将其存储在哪里,以便我可以从任何我想要的活动中访问它

我应该在什么时候(应用程序内生命周期)创建数据库

第一次访问时创建
RoomDatabase
,就像直接使用
SQLiteOpenHelper
一样

我应该把它存放在哪里

单例将是一种典型的模式,就像直接使用
SQLiteOpenHelper
时一样

这两个问题都与错误消息无关。这是在后台线程上访问数据库的问题,就像直接使用
SQLiteOpenHelper
时一样。对于
@Query
方法,您可以选择让该方法返回
LiveData
或RxJava类型(例如,
Flowable
),在这种情况下,Room将负责在后台线程上执行工作。对于其他操作(例如,
@Insert
),您自己负责在后台线程上调用这些方法(
thread
AsyncTask
ThreadPoolExecutor
IntentService
JobIntentService
,等等)