在 Core Data 中使用数据模型迁移时应用程序崩溃

Posted

技术标签:

【中文标题】在 Core Data 中使用数据模型迁移时应用程序崩溃【英文标题】:Application is crashing when using data model migration in Core Data 【发布时间】:2013-12-13 20:03:16 【问题描述】:

我正在尝试弄清楚如何让我的应用能够从一个数据模型版本迁移到另一个版本。

我在网上阅读了一大堆资源,发现使用 Magical Record 真的很有用,尤其是 MR_coordinatorWithAutoMigratingSqliteStoreNamed 方法。

一切看起来都很好,直到我开始做一些测试,当我注意到应用程序在以下情况下崩溃时。

所以这是我的数据模型版本...当我使用文档版本或 document4 版本时一切正常...但是当我选择 document3 版本时,我遇到了这个崩溃:

非常感谢任何形式的帮助!

【问题讨论】:

该错误告诉您它试图从多个模型中合并,并且每个模型中的 VideoInfo 实体都不同。检查您的应用程序包中是否包含其他模型。 嗯...我正在尝试迁移模型,如果您从我的屏幕截图中注意到我确实有 3 个不同版本的模型,并且确实 VideoInfo 实体已更改...但正如我所说仅当我使用介于第一个版本和最后一个版本之间的版本时才会发生错误 是的,我看到了,但是您是否还有其他模型,而不仅仅是上面显示的模型的不同版本,它以某种方式包含在应用程序包中。打开编译好的app bundle并查看 【参考方案1】:

使用迁移时,您必须从 .momd 包手动创建数据模型。因此,对于在应用程序委托中创建的 managedObjectModel 访问器方法,您需要对默认实现的内容稍作更改:

- (NSManagedObjectModel *)managedObjectModel 

    if (managedObjectModel != nil) 
        return managedObjectModel;
    

    // modified method
    NSString *path = [[NSBundle mainBundle] pathForResource:@"VideoInfo" ofType:@"momd"];
    NSURL *momURL = [NSURL fileURLWithPath:path];
    managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];

    return managedObjectModel;

here 有一个很好的解释。

【讨论】:

我实际上正在这样做......它并没有解释为什么我可以轻松加载我的数据模型的第一个和最后一个版本,并让我的应用程序正常工作,但没有版本两者之间似乎工作正常

以上是关于在 Core Data 中使用数据模型迁移时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

在迁移时从 iCloud 迁移到本地商店崩溃的应用程序“对象不能为零” - 使用 Core Data

在 Core Data 中进行重量级迁移时尝试迁移 nil 属性值

轻量级迁移后如何从 Core Data 中删除数据

Core Data 的推断映射模型创建(轻量级迁移)崩溃。线程问题?

iCloud、Core Data、迁移和模型映射

有两个相同模型版本时的 Core Data 迁移