通过删除所有内容重新填充会议室数据库



我现在用MVVM arch完成了关于房间db的android代码实验室。但有一部分我并不完全理解。这是来自Codelab的一句话:

删除所有内容并重新填充数据库 无论何时创建应用程序,您都将创建一个 RoomDatabase.Callback 并覆盖 onCreate()。

这是他们提供的代码:

private class WordDatabaseCallback(
private val scope: CoroutineScope
) : RoomDatabase.Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
super.onCreate(db)
INSTANCE?.let { database ->
scope.launch {
populateDatabase(database.wordDao())
}
}
}
suspend fun populateDatabase(wordDao: WordDao) {
// Delete all content here.
wordDao.deleteAll()
}
}

我不明白的部分是"删除所有内容"。 为什么在创建应用程序时需要删除所有内容? "每当创建应用程序时"是什么意思? 是第一次安装应用程序还是每次打开应用程序?

当我不使用此代码时,该应用程序也可以正常工作。 有人可以解释删除所有内容的目的吗?

为什么在创建应用程序时需要删除所有内容?

您不需要,这是一个特定场景,无论出于何种原因,您希望应用程序删除存储在数据库中的所有内容。但是无论如何都不应该有任何,因为只有在数据库实际上不存在时才调用onCreate(除非手动调用),因此不会有要删除的内容。

  • 如果使用.createFromAsset使用了预打包的数据库,则不会调用onCreate

  • 我相信他们刚刚包含了一个简单的,不太可能失败的介绍,使用回调。

"每当创建应用程序时"是什么意思? 是首次安装应用程序还是每次打开应用程序?

前者。这就是数据库的全部目的是长期存储数据。因此,数据库存储在应用程序的数据空间中。安装应用程序后,数据空间将没有数据库。因此,应用程序和房间必须知道创建数据库,然后才能使用它。

因此,当您尝试使用数据库时,准备使用数据库的处理会检查数据库是否存在。

  • 如果数据库确实存在,则它继续运行而不调用onCreate

  • 如果数据库不存在,则 Room 将尝试通过onCreate方法创建数据库及其中的表。Callback允许在此阶段通过覆盖onCreate方法进行干预。

  • 如果应用程序停止并重新运行,数据库仍将存在,并且不会调用onCreate

  • 如果卸载应用程序,然后重新安装数据库将被删除,因此调用onCreate

  • 如果安装了新版本的应用程序,则数据库仍将存在,并且不会调用onCreate

  • 如果安装了新版本的应用程序,并且它包含数据库的新版本,则不会调用onCreate。相反,将采用指定的任何迁移路径。

最新更新