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 创建一个新版本。
这样,您不应该得到异常。 我想这就是你所要求的......
【讨论】:
NofallbackToDestructiveMigration()
如果迁移策略错误会破坏数据。如果迁移逻辑错误并且仅在版本 2 中销毁数据库,我希望它抛出异常
在这种情况下使用 fallbackToDestructiveMigrationFrom(2)。您可以将一组版本传递给 fallbackToDestructiveMigrationFrom,Room 将在尝试迁移之前检查该组。如果数据库版本在该集中,它将不会尝试迁移它,而只是将其销毁。对于每个其他版本,如果找不到迁移,它将引发异常。
但是如果我将来将我的数据库升级到版本 3 并写 Migration(2, 3)
它不会根据文档抛出异常
是的,它会抛出异常。如果您将来创建 Migration(2, 3),则必须删除 fallbackToDestructiveMigrationFrom(2)。你不能把蛋糕吃完就整了:)
如果用户从 1 迁移到 3 怎么办?假设他没有在 2 点更新他的应用程序。以上是关于Room:使用 fallbackToDestructiveMigrationFrom() 进行迁移如何工作?的主要内容,如果未能解决你的问题,请参考以下文章
房间错误:参数的类型必须是使用 @Entity 注释的类或其集合/数组。即使添加了 androidx.room:room-ktx