Room:使用 fallbackToDestructiveMigrationFrom() 进行迁移如何工作?

Posted

技术标签:

【中文标题】Room:使用 fallbackToDestructiveMigrationFrom() 进行迁移如何工作?【英文标题】:Room : How migration with fallbackToDestructiveMigrationFrom() works? 【发布时间】:2020-01-09 03:52:36 【问题描述】:

我有一个带有房间数据库版本 1 的应用程序正在运行。在版本 2 中,我想销毁所有表并重新创建架构,而不是编写 Migration(1, 2) 逻辑。所以我阅读了 docs 并找到了方法 .fallbackToDestructiveMigrationFrom() 。因此,如果我在这里的参数中传递 2,那么我认为它应该重新创建所有表 第 2 版。我无法理解的是他们在文档中提到了一个注释

注意:传递给此方法的任何版本也可能作为开始或结束版本存在于提供给 addMigrations(Migration) 的迁移中。如果在迁移中发现传递给此方法的版本作为开始或结束版本,则会抛出异常

这是否意味着如果我将数据库版本升级到 3 并且有一些架构更改,如果我写 Migration(2, 3) 它会抛出异常?

【问题讨论】:

你试过了吗? :) 不,有空我会试一试。即使它不抛出异常,我也不能冒险写作。 那是公平的,我只是觉得听起来你可以自己尝试一下,至少作为一个开始 【参考方案1】:

我在问题中所说的每一件事都是正确的,除了我必须将 1 作为参数传递给 .fallbackToDestructiveMigrationFrom()

.fallbackToDestructiveMigrationFrom(1) 意味着如果旧数据库版本为 1 则销毁数据库。如果当前版本是 1 ,它不像破坏数据库。这就是我的困惑。

感谢Itamar Kerbel 在聊天中的澄清。

【讨论】:

【参考方案2】:

这是正确的,如果你传递.fallbackToDestructiveMigrationFrom(3)并同时提供Migration(2, 3),Room会抛出异常。

也就是说,听起来你真正想做的是使用fallbackToDestructiveMigration()。 在这种情况下,它将完全按照您的要求进行:

    尝试从版本 X(安装在设备上)升级到版本 Y 如果没有Migration(X, Y),它将破坏架构和数据 并为版本 Y 创建一个新版本。

这样,您不应该得到异常。 我想这就是你所要求的......

【讨论】:

No fallbackToDestructiveMigration() 如果迁移策略错误会破坏数据。如果迁移逻辑错误并且仅在版本 2 中销毁数据库,我希望它抛出异常 在这种情况下使用 fallbackToDestructiveMigrationFrom(2)。您可以将一组版本传递给 fallbackToDestructiveMigrationFrom,Room 将在尝试迁移之前检查该组。如果数据库版本在该集中,它将不会尝试迁移它,而只是将其销毁。对于每个其他版本,如果找不到迁移,它将引发异常。 但是如果我将来将我的数据库升级到版本 3 并写 Migration(2, 3) 它不会根据文档抛出异常 是的,它会抛出异常。如果您将来创建 Migration(2, 3),则必须删除 fallbackToDestructiveMigrationFrom(2)。你不能把蛋糕吃完就整了:) 如果用户从 1 迁移到 3 怎么办?假设他没有在 2 点更新他的应用程序。

以上是关于Room:使用 fallbackToDestructiveMigrationFrom() 进行迁移如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用redis存储分层数据?

房间错误:参数的类型必须是使用 @Entity 注释的类或其集合/数组。即使添加了 androidx.room:room-ktx

Android Room 使用案例

android 开发进程 0.37 room数据存储的使用

FileNotFoundException - 无法使用 Room 实例导入 json

Room----Android数据库(SQLite)