android - 带有预填充数据库的房间

标签 android android-room android-assets android-room-prepackageddatabase

在我的应用程序中,我使用带有预填充数据库 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 选取新文件中的数据?

最佳答案

Furthermore, I don't understand why the app doesn't pick the new myDatabase.db file and still uses the old one.

Room 数据库是持久的,直到被删除为止。 createFromAsset 仅当数据库不存在时才会被调用,因此在正常情况下它不会替换现有数据库。

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

  1. 添加 fallbackToDestructiveMigration 之一或fallbackToDestructiveMigrationFrom
  2. 增加数据库版本号
  3. 不要进行从旧版本到新版本的迁移

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

关于android - 带有预填充数据库的房间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70011949/

相关文章:

java - 在 Android 上将文本转换为图像文件

java - 房间 - 错误无法比较的类型 : int and <null>

Android - RoomDb - 在另一个 Activity 中的选择查询中找不到成功插入的实体

mvvm - 如何在ViewModel层上将普通数据(从房间返回)转换为LiveData

android - SQLiteAssetHelper 生成错误

java - 主题、背景颜色和操作栏的交互

java - 无法获取提供商 com.google.android.gms.measurement.AppMeasurementContentProvider

Android NDK - 在 native 代码中使用 AssetManager

Android - 将文件从 Assets 复制到/数据/数据文件夹

java - 在线程中访问类级别变量