我有一个在后台运行的服务。它在设备 Boot 时启动,完全与活动分离。如果我想使用room,我应该如何使用databaseBuilder?为服务和应用程序构建两次可以吗?它会构建相同的数据库示例吗?
databaseBuilder
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() }
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)
4c8rllxm3#
Room database builder将在第一次运行时创建数据库。之后,它的工作是打开现有(已创建)的数据库。例如,我们可以考虑在数据库打开时使用callback函数。这可能因Activity而异。因此,您可以在应用程序中根据需要使用构建器。但您应该保持正确关闭connections, statements and resultsets等的良好做法。
Room database builder
callback
connections, statements and resultsets
3条答案
按热度按时间8yoxcaq71#
在我的情况下,我需要保存我的位置从服务到Rooom数据库,这个服务使用类型的协程调用,和内部协程一个线程,我的代码:
我服务中的oncreate内的调用类型协程
您应该创建suspend类型方法,因为这是异步调用
i2byvkas2#
您应该为整个应用程序提供数据库的单一执行处理。您可以使用单一执行处理来封存此执行处理,例如:
然后您可以在任何地方调用它,如下所示:
4c8rllxm3#
Room database builder
将在第一次运行时创建数据库。之后,它的工作是打开现有(已创建)的数据库。例如,我们可以考虑在数据库打开时使用callback
函数。这可能因Activity而异。因此,您可以在应用程序中根据需要使用构建器。但您应该保持正确关闭connections, statements and resultsets
等的良好做法。