创建持久存储时 NSPersistentDocument 崩溃

Posted

技术标签:

【中文标题】创建持久存储时 NSPersistentDocument 崩溃【英文标题】:NSPersistentDocument crash when creating persistent store 【发布时间】:2011-03-09 13:37:22 【问题描述】:

最近我在我的 Core Data 模型中添加了一个新实体,因此我为该模型创建了一个新版本并为它创建了一个映射模型。然而,现在我的 NSPersistentDocument 没有明显的原因崩溃了:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
                                                                        [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

BOOL success = [self configurePersistentStoreCoordinatorForURL:storeURL ofType:typeName modelConfiguration:nil storeOptions:options error:error]; // Line that crashes

控制台日志:

*** -[NSCFArray insertObject:atIndex:]: 尝试插入 nil

如果有帮助,这里是堆栈跟踪:

删除映射模型没有帮助,所以我猜这是因为文档试图加载错误/无数据模型,但我还没有找到一种方法来说明它应该使用给定的数据模型。

编辑:当我使用自己的 ios 核心数据抽象类时,一切都很好。所以万恶之源似乎是NSPersistentDocument。实际上我不想切换回 NSDocument 并且必须再次自己实现核心数据处理,所以非常感谢任何帮助!

【问题讨论】:

【参考方案1】:

您可能对模型进行了自动或“推断”迁移无法处理的更改。您可能必须提供一个映射模型来详细说明应该如何进行迁移。

哦,请确保您的旧模型和新模型已进行版本控制,即具有版本号。如果不是,则自动迁移无法区分哪个型号是旧型号,哪个型号是新型号。

【讨论】:

问题是,我有一个映射模型。并且两个数据模型都在 .xcdatamodeld 容器中,新的模型设置了“当前版本”。 好吧,经过更多的测试和玩耍,我找到了真正的原因,旧的 .mom 文件还在,加上新的 .momd 文件。所以基本上你的答案是对的。 哦,是的,我忘记了。出于某种原因,旧编译的 mom 文件在您添加新文件后可能会挂起。您通常必须从模拟器/设备上删除应用程序并清理构建以摆脱它。希望他们在 Xcode 4 中解决了这个问题。【参考方案2】:

好的,我通过覆盖- (id)managedObjectModel 并自己返回一个有效的托管对象模型来让它工作。对于具有多个版本的模型,NSPersistentDocument 似乎无法自行执行此操作。

【讨论】:

它可能是一个损坏的模型文件。毕竟它们只是 XML/plist。这种情况很少见,但有时确实会损坏。

以上是关于创建持久存储时 NSPersistentDocument 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

创建新的持久性存储时崩溃(越狱的 iPhone 设备 4.1)

Core Data - 无法在 iOS 5.1 上创建持久存储

006.OpenShift持久性存储

持久化存储之 PV、PVC、StorageClass

如何在我的无处不在的容器中获取所有可用的持久存储?

托管对象上下文未保存到持久存储