我在Mac OS X 10.5上使用Core Data遇到了一个非常恼人的错误。
我的应用程序中的所有实体都有相同名称的类。
到目前为止,我已经完成了5次迁移而没有任何问题。
我正在使用XML数据存储。 我的数据模型的V5有13个实体,其中4个是抽象的。它看起来像这样: alt text http://synapticmishap.co.uk/ObjectModel.jpg
我做什么
创建我的数据的新版本 model - 这是V6。
添加新实体(JGToolbarWindow) 并将父级设置为JGWindowBase。
添加了一个来自的映射模型 V5到V6。保存了。
将当前版本设置为V6。
构建和调试。
我在Persistent Store Coordinator选项字典中启用了自动迁移。
问题
收到错误消息 - “多次验证 发生了错误。“
我设置了断点并进行了检查 验证错误。有很长一段路 验证错误列表 - 那里 对于每个数据输入似乎都是一个。
似乎它正在剥夺ALL 关系,因为我的一个 properties - application - 设置为 被要求,这算作一个 验证错误。
所以似乎问题在于 迁移无法迁移 关系......即使 显然到目前为止没有任何改变 关系走了。
当我查看〜/ Library / Application时 支持/我的应用程序的名称/我看到一个XML 数据存储具有相同的名称 附上.xml.new当看 所有的文本编辑器中的这个文件 关系确实存在 剥离了。
我尝试了什么
创建新的XML数据存储和 放入一些物品, 然后再试一次。我得到了同样的结果 每个项目的错误。
清洁和重建。
确保旧的.xml.new 以前的验证已经完成 删除。
删除新的模型版本和 重复我的行动,以确保我 没有搞砸了。
为每个添加映射条目 抽象类,是 默认情况下被忽略全部添加 属性和关系。仍然 完全相同的错误。
尝试添加一个新实体 没有一个班级,只是基于 NSManagedObject有 JGWindowBase作为父母。再次, 失败。
我能想到的唯一改变的是我在模型底层的类中的一些内部逻辑。但这些都是微不足道的变化,我无法理解它是如何正常迁移的,现在不是什么都没有发生变化。
我尝试从重命名的最新数据存储中进行全新的迁移,并且遇到完全相同的问题。这意味着我必须为任何数据迁移工作解决这个问题。
错误
当我在
下面的presentError行放置断点时if (![persistentStoreCoordinator addPersistentStoreWithType:NSXMLStoreType
configuration:nil
URL:url
options:options
error:&error]){
[[NSApplication sharedApplication] presentError:error];
}
并检查错误userInfo,我收到很多这样的错误:
Error Domain=NSCocoaErrorDomain Code=1570 UserInfo=0x67ebfd0 "item is a required value."
po (NSArray *)0x67ebfd0
给出:
NSLocalizedDescription = "item is a required value.";
NSValidationErrorKey = item;
NSValidationErrorObject = <NSManagedObject: 0x45d5830> (entity: JGLogEntry; id: 0x4baccb0 <x-coredata://B597E13E-BE74-402E-BF00-5E1D57898406/JGLogEntry/p13942> ; data: {
duration = nil;
item = nil; // <<< Here's the problem.
processBundleID = nil;
processID = nil;
processName = nil;
startTime = 2009-10-09 16:41:44 +0100;
stopTime = 2009-10-09 16:42:17 +0100;
windowDocumentPathOrURL = nil;
windowID = nil;
windowTitle = nil;
这一切真的告诉我,它删除了与item相关的关系,这是一个必需的属性,这就是为什么它告诉我有验证错误。应用程序也有一个完整的负载,这是另一个必需的属性。
正如我所看到的,问题不在于验证错误,而在于它似乎没有迁移任何关系。
我正用这个把头发拉出来。我真的很感激一些帮助。最后,星球大战引用:“帮助我,Stack Overflow。你是我的 只有希望。“
答案 0 :(得分:0)
升级到雪豹
Snow Leopard似乎解决了这个问题 - 自升级以来,我没有遇到任何迁移数据的问题。
或者,我认为它可能会因为我切换到SQLite数据存储而消失,尽管我认为使用抽象对象的迁移更有可能在Leopard上有点破坏。