我现在用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
。相反,将采用指定的任何迁移路径。