android 从服务和活动访问房间数据库

mxg2im7a  于 2022-11-27  发布在  Android
关注(0)|答案(3)|浏览(91)

我有一个在后台运行的服务。它在设备 Boot 时启动,完全与活动分离。
如果我想使用room,我应该如何使用databaseBuilder?为服务和应用程序构建两次可以吗?它会构建相同的数据库示例吗?

8yoxcaq7

8yoxcaq71#

在我的情况下,我需要保存我的位置从服务到Rooom数据库,这个服务使用类型的协程调用,和内部协程一个线程,我的代码:
我服务中的oncreate内的调用类型协程

GlobalScope.launch (Dispatchers.Main) { 
      onNewLocation()  //call to metodo of type suspend 
}

您应该创建suspend类型方法,因为这是异步调用

suspend fun onNewLocation() {
      
     //call Room database inside thread

       val thread = Thread {
            val db = myDatabase.getDataBase(this@LocationUpdatesService)

            db.locationDao().addLocation(locationentity)
        }

        thread.start()

}
i2byvkas

i2byvkas2#

您应该为整个应用程序提供数据库的单一执行处理。您可以使用单一执行处理来封存此执行处理,例如:

@Database(entities = [YourEntity::class], version = 1)
abstract class YourRoomDatabase: RoomDatabase() {

    abstract fun yourDao(): YourDao

    companion object {

        private var INSTANCE: YourRoomDatabase? = null

        fun getInstance(context: Context): YourRoomDatabase {
            if (INSTANCE == null) {
                INSTANCE = Room.databaseBuilder(context, YourRoomDatabase::class.java, "yourdb.db").build()
            }
            return INSTANCE!!
        }

        fun destroyInstance() {
            INSTANCE = null
        }
    }

}

然后您可以在任何地方调用它,如下所示:

YourRoomDatabase.getInstance(context)
4c8rllxm

4c8rllxm3#

Room database builder将在第一次运行时创建数据库。之后,它的工作是打开现有(已创建)的数据库。例如,我们可以考虑在数据库打开时使用callback函数。这可能因Activity而异。因此,您可以在应用程序中根据需要使用构建器。但您应该保持正确关闭connections, statements and resultsets等的良好做法。

相关问题