我正在开发一个 Android 应用程序,您可以在其中玩“Wordle”。我希望能够离线使用它,因此我有一个 Room 数据库,其中包含所有可能的单词(目前大小约为 30MB)。我想随我的应用程序一起提供该数据库,但我也希望能够在应用程序更新中更新数据库(添加/删除条目)。我怎样才能有效地做到这一点?
我当前的数据库管理器包含此功能:
fun getDatabase(context: Context): AppDatabase {
if (INSTANCE == null) {
synchronized(AppDatabase::class.java) {
INSTANCE = Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java, "words"
)
.allowMainThreadQueries()
.createFromAsset("words.db")
.build()
}
}
return INSTANCE!!
}
根据我的理解,这段代码会查看是否存在数据库,如果没有,则从资产文件夹中的文件 Words.db 文件创建一个新数据库。在此过程中,它将文件复制到工作目录中,然后像普通的 Room DB 一样包含它。 在我看来,这个过程不是很有效,因为每次进程终止并重新启动应用程序时都会复制数据库。我该如何更有效地做到这一点?我怎样才能通过应用程序更新来更新数据库?
在我看来,这个过程不是很有效,因为每次进程终止并重新启动应用程序时都会复制数据库
事实并非如此。如果之前未复制数据库,它只会复制资产一次。
FWIW,我在这本免费书的本章中介绍了预填充的数据库和 Room。
我怎样才能通过应用程序更新来更新数据库?
虽然 Room 可以帮助检测和处理 schema 更新,但您需要自行跟踪 content 更新。所以,你尝试这样的事情:
有一个代表您的数据库内容版本的 Room 实体。该版本可以表示为日期、类似于
versionCode
的版本号或其他内容。
让您的预填充数据库在与该实体关联的表中包含其版本。
让您的 Kotlin 或 Java 代码使用相同的版本标识符,例如通过
BuildConfig
。
打开数据库后,使用 DAO 查询内容版本实体,并将其值与 Kotlin 或 Java 代码中的值进行比较。如果您的代码中的数据库较新,则表明您的用户拥有较旧的数据库。在这种情况下,您可以关闭数据库,删除数据库文件,然后重新打开数据库。这将触发 Room 从(较新的)资产创建一个新的副本。