【问题标题】:Room Migration with prepopulated DB - Is fallbackToDestructiveMigration() my only option?使用预填充数据库进行房间迁移 - fallbackToDestructiveMigration() 是我唯一的选择吗?
【发布时间】:2020-12-14 02:34:44
【问题描述】:

我的数据库中有几个表,其中一些包含用户无法更改的预填充内容,而另一些则仅由用户填写。 现在我想更新预填充的静态内容,但保留用户生成的内容。

这个 Android developer guide 对我的问题说了以下内容:

由于存在从版本 2 到版本 3 的已实现迁移路径,Room 运行定义的 migrate() 方法将设备上的数据库实例更新到版本 3,从而保留数据库中已有的数据。 Room 不使用预打包的数据库文件,因为 Room 仅在回退迁移的情况下使用预打包的数据库文件。

所以这意味着我不可能,例如:从 3 列 X、Y 和 Z - 删除列 X 和 Z 并使用更新的 DB 文件中的新内容重新创建它们,同时保持列 Y 不变?

以下是该问题的说明。


我现在只有2个选项对吗:

  1. 完全删除表格并让用户丢失其生成的内容,因此他们可以拥有更新后的预填充内容
  2. 为新结构编写迁移,但最终会得到空列 X.2 和 Z.2,因为 Room 将忽略我预填充的 DB 2.0

【问题讨论】:

  • "drop table X and Z" - 您的问题中没有名为 X 和 Z 的表。你的意思是X列和Z列吗?如果是这样,Room 对您的方案没有任何类型的自动支持。不过,您的迁移不需要产生空列。填写它们是您的工作。毕竟,如果您无法填写它们(作为数据库模式的设计者和开发人员),您如何期望 Room 填写它们?
  • @CommonsWare 是的,刚刚修正了错字。但那我该如何填写呢?我想我会通过数据库编辑器(如数据库浏览器)将新内容(较长的文本)写入 sqlite 文件,然后让 Room 将新内容注入用户设备上的现有数据库中。您的意思是我必须在迁移后编写一些逻辑来手动注入该内容吗?
  • “你的意思是我必须编写一些逻辑来在迁移后手动注入该内容吗?” ——我不知道内容和模式之间的关系,但即兴发挥,我会考虑成为迁移的一部分。因此,除了用于将架构转换为新结构的其他 SQL 之外,您还需要更新固定内容。例如,这可能来自 Web 服务调用。通过努力,您可以将打包的数据库复制到废品文件中,使用ATTACH DATABASE 访问它,然后引用该数据作为更新固定内容的一部分。
  • @CommonsWare 谢谢,您是否有链接可以让我了解更多相关信息?我只知道数据库管理的基础知识,有点害怕把事情搞砸,所以我想在尝试之前先了解一下这个话题。
  • 我不确定“它”是什么。如果你的意思是我的最后一句话,我唯一方便的是github.com/commonsguy/cwac-saferoom/blob/master/saferoom/src/…,这是一种加密数据库的方法。在那里,我使用ATTACH DATABASE <path> AS <alias> 将外部数据库文件附加到打开的数据库连接,因此我可以同时引用两者。我的情况与您的情况不同(例如,您不会有 KEY 来提供密码),但这是我最接近的匹配。

标签: android android-room database-migration


【解决方案1】:

看看这个库,也许它可以帮助你解决这个问题
https://github.com/ueen/RoomAssetHelper

您可以命名应该保留的表和列,然后重命名现有数据库,复制新数据库并传输指定的列。

来自 GitHub 页面的示例:

val db = RoomAssetHelper.databaseBuilder(applicationContext,
                       AppDatabase::class.java, 
                       "chinook.db",
                       1,
                       preserve = arrayOf(TablePreserve(table = "yourTable",
                                        preserveColumns = arrayOf("yourColumn"),
                                        matchByColumns = arrayOf("id"))))
                .build()

【讨论】:

  • 嘿伙计,我当时并没有真正考虑您的建议,直到我现在不得不再次升级数据库并回到这里。这个图书馆真的很棒!我未能手动正确重置内容,但它成功了,再次感谢!
猜你喜欢
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
  • 2021-12-28
  • 1970-01-01
相关资源
最近更新 更多