objective-c - 核心数据迁移的验证错误

标签 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. 创建我的数据的新版本 型号 - 这是 V6。

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

  3. 添加了一个映射模型,来自 V5至V6。已保存。

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

  5. 构建和调试。

我已在持久存储协调器选项字典中打开自动迁移。

问题

  1. 收到错误 - “多重验证 发生错误。”

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

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

  4. 看来问题出在 迁移无法迁移 关系...尽管 显然到目前为止一切都没有改变 随着关系的发展。

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

我尝试过的

  1. 创建新的 XML 数据存储并 将一些元素放入其中, 然后再试一次。我也得到同样的结果 每个项目的错误。

  2. 清理和重建。

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

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

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

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

我认为唯一发生变化的是模型底层类中的一些内部逻辑。但这些都是微小的变化,我无法理解它是如何顺利迁移的,而现在似乎没有任何变化。

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

错误

当我在下面的 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;

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

据我所知,问题不在于验证错误本身,而在于它似乎根本没有迁移任何关系

我正在为此抓狂。我真的非常感谢一些帮助。最后,引用《星球大战》中的一段话:

"Help me, Stack Overflow. You're my only hope."

最佳答案

升级到雪豹

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

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

关于objective-c - 核心数据迁移的验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1561981/

相关文章:

objective-c - 获取NSView的布局框架(即ibLayoutInset)

ios - 从备份还原sqlite文件后如何重置Core Data堆栈?

objective-c - 对多个位置进行地理编码 - 了解何时调用 "All"完成 block

objective-c - 写入后 NSOutputStream 因访问错误而崩溃(Objective-c)

objective-c - 从http get请求中解析对象c中的json响应

objective-c - WKWebView 的打印内容 (OS X)

ios - 自定义 UITableView 部分标题,奇怪的行为

objective-c - NSCoder 和/或 NSKeyedUnarchiver 如何处理同一对象的多次解码?

ios - iCloud和轻量级迁移

ios - 使用 CollectionView 删除 Core Data 中的记录