我在 Mac OS X 10.5 上使用 Core Data 时遇到了一个非常烦人的错误。
我的应用程序中的所有实体都有共享相同名称的类。
到目前为止,我已经完成了 5 次迁移,没有出现任何问题。
我正在使用 XML 数据存储。我的数据模型 V5 有 13 个实体,其中 4 个是抽象的。它看起来像这样: 替代文本 http://synapticmishap.co.uk/ObjectModel.jpg
我所做的
创建我的数据模型的新版本 - 这是 V6。
添加一个新实体(JGToolbarWindow)并将父级设置为 JGWindowBase。
添加了从 V5 到 V6 的映射模型。保存了它。
将当前版本设置为 V6。
构建和调试。
我在 Persistent Store Coordinator 选项字典中打开了自动迁移。
问题
收到错误 - “发生多个验证错误。”
我设置了一个断点并检查了验证错误。有一长串验证错误——似乎每个数据条目都有一个。
似乎它正在剥离所有关系,并且由于我的属性之一 - 应用程序 - 被设置为必需,这被视为验证错误。
因此,问题似乎在于迁移无法迁移关系......即使就关系而言显然没有任何改变。
当我查看 ~/Library/Application Support/Name of my app/ 我看到一个 XML 数据存储,它的名称附加了 .xml.new 在文本编辑器中查看此文件时,所有关系确实已被剥离出去。
我试过的
创建一个新的 XML 数据存储并在其中放入一些项目,然后再试一次。我对每个项目都得到相同的错误。
清洁和重建。
确保先前验证中的旧 .xml.new 已被删除。
删除新模型版本并重复我的操作以确保我没有搞砸什么。
为每个抽象类添加映射条目,默认情况下会被忽略。添加了所有属性和关系。仍然是完全相同的错误。
尝试添加一个没有类的新实体,仅基于以 JGWindowBase 作为父级的 NSManagedObject。再一次,失败了。
我认为唯一改变的是模型底层类中的一些内部逻辑。但这些都是微小的变化,我无法理解它是如何顺利迁移的,现在不是什么都没有改变。
我已经尝试从重命名的最新数据存储进行全新迁移,并且遇到了完全相同的问题。这意味着我必须解决这个问题才能使任何数据迁移工作。
错误
当我在下面的 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;
所有这一切真正告诉我的是它删除了与项目相关的关系,这是一个必需的属性,这就是它告诉我存在验证错误的原因。应用程序也有一个完整的负载,这是另一个必需的属性。
在我看来,问题不在于验证错误本身,而在于它似乎根本没有迁移任何关系。
我用这个把头发拉出来。我真的非常感谢一些帮助。最后,引用《星球大战》中的一句话:
“帮帮我,Stack Overflow。你是我唯一的希望。”