核心数据迁移的验证错误

时间:2009-10-13 18:10:46

标签: objective-c cocoa core-data mapping-model core-data-migration

我在Mac OS X 10.5上使用Core Data遇到了一个非常恼人的错误。

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

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

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

我做什么

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

  2. 添加新实体(JGToolbarWindow) 并将父级设置为JGWindowBase。

  3. 添加了一个来自的映射模型 V5到V6。保存了。

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

  5. 构建和调试。

  6. 我在Persistent Store Coordinator选项字典中启用了自动迁移。

    问题

    1. 收到错误消息 - “多次验证 发生了错误。“

    2. 我设置了断点并进行了检查 验证错误。有很长一段路 验证错误列表 - 那里 对于每个数据输入似乎都是一个。

    3. 似乎它正在剥夺ALL 关系,因为我的一个 properties - application - 设置为 被要求,这算作一个 验证错误。

    4. 所以似乎问题在于 迁移无法迁移 关系......即使 显然到目前为止没有任何改变 关系走了。

    5. 当我查看〜/ Library / Application时 支持/我的应用程序的名称/我看到一个XML 数据存储具有相同的名称 附上.xml.new当看 所有的文本编辑器中的这个文件 关系确实存在 剥离了。

    6. 我尝试了什么

      1. 创建新的XML数据存储和 放入一些物品, 然后再试一次。我得到了同样的结果 每个项目的错误。

      2. 清洁和重建。

      3. 确保旧的.xml.new 以前的验证已经完成 删除。

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

      5. 为每个添加映射条目 抽象类,是 默认情况下被忽略全部添加 属性和关系。仍然 完全相同的错误。

      6. 尝试添加一个新实体 没有一个班级,只是基于 NSManagedObject有 JGWindowBase作为父母。再次, 失败。

      7. 我能想到的唯一改变的是我在模型底层的类中的一些内部逻辑。但这些都是微不足道的变化,我无法理解它是如何正常迁移的,现在不是什么都没有发生变化。

        我尝试从重命名的最新数据存储中进行全新的迁移,并且遇到完全相同的问题。这意味着我必须为任何数据迁移工作解决这个问题。

        错误

        当我在

        下面的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。你是我的   只有希望。“

1 个答案:

答案 0 :(得分:0)

升级到雪豹

Snow Leopard似乎解决了这个问题 - 自升级以来,我没有遇到任何迁移数据的问题。

或者,我认为它可能会因为我切换到SQLite数据存储而消失,尽管我认为使用抽象对象的迁移更有可能在Leopard上有点破坏。