代码之家  ›  专栏  ›  技术社区  ›  John Gallagher

核心数据迁移的验证错误

  •  2
  • John Gallagher  · 技术社区  · 15 年前

    我在Mac OS X 10.5上使用核心数据时遇到了一个非常恼人的错误。

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

    到目前为止,我已经进行了5次无问题的迁移。

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

    我做什么

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

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

    3. 添加了一个映射模型, V5至V6。救了它。

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

    5. 生成和调试。

    我在Persistent Store Coordinator Options字典中打开了自动迁移。

    问题

    1. 获取错误-“多次验证 出现错误。“

    2. 我设置了一个断点并检查了 验证错误。有一个很长的 验证错误列表-存在 似乎每个数据条目都是一个。

    3. 似乎它正在剥离所有 因为我的关系 属性-应用程序-设置为 必须输入,这算作 验证错误。

    4. 所以问题似乎在于 迁移无法迁移 关系…尽管 显然到目前为止没有什么变化 随着关系的发展。

    5. 当我在~/library/application中查找时 支持/我的应用的名称/我看到一个XML 具有相同名称的数据存储 在查看时附加了.xml.new 此文件在文本编辑器中,所有 关系确实是 剥去

    我试过什么

    1. 创建新的XML数据存储并 把一些东西放进去, 然后再试一次。我也一样 每个项目的错误。

    2. 清洁和重建。

    3. 确保旧的.xml.new来自 以前的验证已 删除。

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

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

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

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

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

    错误

    当我在下面的演示者行放置断点时

    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;
    

    所有这些都告诉我它已经删除了连接到项的关系,这是一个必需的属性,这就是它告诉我存在验证错误的原因。应用程序也有一个完整的负载,这是另一个必需的属性。

    如我所见,问题不在于验证错误,因为它似乎没有迁移 任何关系 .

    我要用这个把头发拔出来。我真的非常感谢你的帮助。最后,一句星球大战的名言:

    “帮帮我,堆栈溢出。你是我的 只有希望。”

    1 回复  |  直到 13 年前
        1
  •  0
  •   John Gallagher    15 年前