带有预填充数据库的房间

Posted

技术标签:

【中文标题】带有预填充数据库的房间【英文标题】:Room with prepopulated database 【发布时间】:2021-12-28 21:02:28 【问题描述】:

在我的应用程序中,我使用的是带有预填充数据库 myDatabase.db 的 Room,然后使用以下代码访问该数据库:

private val database = Room
        .databaseBuilder(context.applicationContext, AppDatabase::class.java, dbName)
        .createFromAsset("myDatabase.db")
        .build()

文件myDatabase.db 存储在/assets/ 文件夹中。然后我不得不在这样的数据库中的表上添加一些新行。之后,我得到了一个更新的 myDatabase.db 文件,我将它复制到 /assets/ 文件夹中,替换了旧文件。问题来了:安装应用程序后,它仍然使用旧数据。我做了一些搜索,但只找到了与迁移相关的结果。但是,就我而言,表的架构没有变化,只是添加了一些新行。此外,我不明白为什么该应用程序不选择新的myDatabase.db 文件并仍然使用旧文件。

让应用程序使用新文件myDatabase.db 的唯一解决方案是卸载应用程序,然后重新安装,但这是我想避免的事情。那么,如何更改 assets 文件夹中的文件 myDatabase.db 并让应用通过 Room 选择新文件中的数据?

【问题讨论】:

【参考方案1】:

此外,我不明白为什么该应用程序不选择新的 myDatabase.db 文件并仍然使用旧文件。

Room 数据库是持久的,并且一直持续到它被删除。 createFromAsset 只会在数据库不存在时调用,因此在正常情况下它不会替换现有数据库。

假设应用程序只读取预先填充的数据库的解决方案是:-

    添加fallbackToDestructiveMigrationfallbackToDestructiveMigrationFrom 增加数据库版本号 没有涵盖旧版本到新版本的迁移

迁移而不是失败将删除数据库,然后尝试创建它。这样做时,它将从新资产创建数据库。

【讨论】:

感谢您的回答。是的,App 只读取数据,所以第一种方法应该可行。

以上是关于带有预填充数据库的房间的主要内容,如果未能解决你的问题,请参考以下文章

使用 Paging 3 Android 从房间获取最新数据

如何在 hilt viewModel 下使用一些数据预先填充房间数据库?

带有更新的预填充数据库的 Android Room 迁移

如何交付带有预填充领域数据库的应用程序

带有预填充数据的 Angular2 表单验证

带有 SQLite 插件的 Phonegap 预填充 SQLite 数据库?与Phonegap 1.2 兼容吗?