2

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

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

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

我正在使用 XML 数据存储。我的数据模型 V5 有 13 个实体,其中 4 个是抽象的。它看起来像这样: 替代文本 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. 当我查看 ~/Library/Application Support/Name of my app/ 我看到一个 XML 数据存储,它的名称附加了 .xml.new 在文本编辑器中查看此文件时,所有关系确实已被剥离出去。

我试过的

  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];
}

并检查错误 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。你是我唯一的希望。”

4

1 回答 1

0

升级为雪豹

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

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

于 2009-12-07T14:38:09.387 回答