2

我在Mac OS X 10.5上使用Core Data时遇到了一个令人讨厌的错误。核心数据迁移验证错误

所有的实体在我的应用程序中有共享相同名称的类。

到目前为止,我已经完成了5次迁移,没有任何问题。

我正在使用XML数据存储。 我有13个实体的V5数据模型,其中4个是抽象的。它看起来像这样: alt text http://synapticmishap.co.uk/ObjectModel.jpg

我做什么

  1. 创建我的数据的新版本 模型 - 这是V6。

  2. 添加一个新的实体(JGToolbarWindow) 并将父项设置为JGWindowBase。

  3. 添加了从 V5到V6的映射模型。保存它。

  4. 将当前版本设置为V6。

  5. 构建和调试。

我已经在Persistent Store Coordinator选项字典中打开了自动迁移。

的问题

  1. 得到一个错误 - “多重验证发生 错误。”

  2. 我设置了一个断点并检查了 验证错误。有很长的 验证错误列表 - 那里 似乎是每个数据项的一个。

  3. 看来,它剥离了所有 的关系,因为我的 属性之一 - 应用 - 设置为 需要,这算作一个 验证错误。

  4. 如此看来,问题在于不能够迁移 的关系......即使 明显没有已远 的关系去改 迁移。

  5. 当我看到在〜/库/应用程序支持 /我的应用程序的名称/我看到那种有由.xml.new附加当 这个文件将在文本寻找同名 一个XML 数据存储编辑,所有 关系确实已被剥离出 。

我已经试过

  1. 创建一个新的XML数据存储和 把几件作品在里面,然后 重试。我为每个项目获得相同的 错误。

  2. 清洁和重建。

  3. 确保旧的.xml.new从 以前的验证已被删除,其中 已删除。

  4. 删除新的模型版本和 重复我的行动,以确保我 没有搞砸了。

  5. 为 中的每个 添加映射条目,默认情况下会忽略抽象类 。添加了所有 属性和关系。还是 完全一样的错误。

  6. 尝试添加具有 JGWindowBase作为父项的新实体 没有一类,只是根据 NSManagedObject。再次, 失败。

我能想到的唯一改变的是我在模型的基础类中的一些内部逻辑。但这些都是微小的变化,我无法理解它是如何迁移的好,现在不是什么都没有改变。

我试过了一个全新的从最新的数据存储迁移过来的迁移,并且有完全相同的问题。这意味着我必须解决这个问题,任何数据迁移工作。

错误

当我把一个断点在presentError线以下

if (![persistentStoreCoordinator addPersistentStoreWithType:NSXMLStoreType 
                configuration:nil 
                  URL:url 
                 options:options 
                  error:&error]){ 
      [[NSApplication sharedApplication] presentError:error]; 
} 

并检查错误用户信息,我得到很多的错误是这样的:

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; 

这一切真的告诉我的是,它删除连接到项目的关系,这是一个必需的属性,它就是为什么它告诉我有验证错误。应用程序也有整个负载,这是另一个必需的属性。

正如我所看到的那样,问题不在于验证错误,因为它似乎不会迁移任何关系在所有

我把我的头发拉出来。我真的很感激一些帮助。最后,星球大战报价:

“帮帮我,堆栈溢出。你是我的 唯一的希望。”

+0

你真的能向我们展示一个验证错误的例子吗? – 2009-10-13 19:42:49

+0

我的回忆是,涉及抽象基础关系的映射很困难。确切的错误可能有助于指向正确的方向。 – 2009-10-13 19:43:48

+0

感谢评论,巴里。我发布了一些错误的东西。我只是不明白我如何能够成功地迁移抽象基类的2/3倍,但没有改变任何东西,它突然间就会对我产生影响。 – 2009-10-13 22:39:27

回答

0

升级雪豹

雪豹似乎为解决这个问题 - 我已经没有用,因为升级迁移数据的任何问题。

另外,我想它可能会消失,因为我切换到SQLite数据存储,尽管我认为更有可能在Leopard上使用抽象对象进行迁移有点破碎。

+1

你也可以尝试添加一个版本哈希修饰符到你的抽象实体中以便迁移。我在过去发现如果模型不够多,你会得到这个效果。它在实体编辑器中的该扳手选项卡下 – 2011-03-04 21:50:33