【问题标题】:CoreData 1570 Error CodeCoreData 1570 错误代码
【发布时间】:2011-12-13 07:33:02
【问题描述】:

目前我所有的保存都进入内存,但没有写入磁盘 (iOS)。我的应用程序设置了一个UITableView,并在其上显示了一个添加模式视图以创建内容,当用户完成创建内容并单击保存按钮时,我打印了新项目(由我的 CoreData 模型创建的 NSManagedObject 类)将其取出并完全填写。在此之后,我立即尝试将其保存到磁盘并使用相同的对象 ID 生成错误消息,但字段为 nil。然而在两者之间我的 UITableViews - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath 正在调用记录 @"CanEdit" 的方法。

谁能看出我做错了什么?

这里是代码

        NSLog(@"newItem %@", newItem);
    NSError *error;
    if (![newItem.managedObjectContext save:&error]) {
        // Handle the error.
        NSLog(@"%@", error);
    }

    if (editItem) {
        [self.navigationController popViewControllerAnimated:YES];
    } else {
        [self dismissModalViewControllerAnimated:YES];            
    }

这是我的错误

2011-10-22 15:24:46.322 App[42115:fb03] newItem <Item: 0x81a4a30> (entity: Item; id: 0x81a0ab0 <x-coredata:///Item/t7F2B54D2-0DCC-4530-88D5-900BE25C7DC23> ; data: {
    containedIn = "0x6e89010 <x-coredata:///Item/t7F2B54D2-0DCC-4530-88D5-900BE25C7DC22>";
    contains =     (
    );
    content = a;
    dateLastUsed = nil;
    depth = 0;
    encrypted = 0;
    favorite = 0;
    favoritePosition = nil;
    folder = 0;
    fullPath = "^Templates^Add Title";
    name = a;
    sortPosition = 0;
})
2011-10-22 15:24:46.323 App[42115:fb03] CanEdit
2011-10-22 15:24:46.326 App[42115:fb03] Error Domain=NSCocoaErrorDomain Code=1570 "The operation couldn’t be completed. (Cocoa error 1570.)" UserInfo=0x6ecc490     
{NSValidationErrorObject=<Item: 0x6e88fb0> (entity: Item; id: 0x6e89010 <x-coredata:///Item/t7F2B54D2-0DCC-4530-88D5-900BE25C7DC22> ; data: {
    containedIn = nil;
    contains =     (
        "0x81a0ab0 <x-coredata:///Item/t7F2B54D2-0DCC-4530-88D5-900BE25C7DC23>"
    );
    content = nil;
    dateLastUsed = nil;
    depth = 0;
    encrypted = 0;
    favorite = 0;
    favoritePosition = nil;
    folder = 1;
    fullPath = "^Templates^";
    name = Templates;
    sortPosition = 0;
}), NSValidationErrorKey=content, NSLocalizedDescription=The operation couldn’t be completed. (Cocoa error 1570.)}

【问题讨论】:

  • 我之前看到过,我知道这个错误是由于未设置必填字段,但我的问题是为什么它从设置变为不设置之后?
  • 该错误消息是针对与您正在记录的实体 (0x6e89010) 不同的实体 (0x81a0ab0),并且似乎一个包含另一个。 Core Data 是否支持级联?如果是这样,则意味着您实际上是一次调用保存了两个对象,并且容器对象的属性为零。
  • 后人,知道您的自定义托管对象子类中的杂散合成也可以对您执行此操作。

标签: objective-c ios xcode core-data


【解决方案1】:

问题是您的上下文中有一个 MO,它的必填字段设置为 nil。具体来说,这是说 NSValidationErrorKey=content 在前面的 NSValidationErrorObject 中打印为 nil。

要么你有一个逻辑错误,你的值没有在 MO 中正确设置,要么你应该更改你的模型以使该字段成为可选。

【讨论】:

  • 谢谢,我之前发现这就是错误代码的含义,唯一的问题是为什么我的对象从第一个日志中的 content=a 和 name=a 更改为 content=nil 和 name =nil 错误消息的日志,它们紧随其后。我用 newItem.name = @"text here" 设置它们 - 这不是正确的方法吗?
  • 没错。看起来您可能正在创建另一个未正确填充的对象。仔细检查您是否只创建了您期望的对象数量。在子类的 init 方法中设置断点。
  • 谢谢,这是我无意中创建了另一个对象的问题。
  • 在我的情况下,我多次将 MO 作为属性添加到另一个 MO,但关系被定义为双方的一对一关系,这导致 saveContext 中出现验证违规错误。将关系设置为一对多可以解决问题。
【解决方案2】:

从上面的错误输出中,您可以看到有两个不同的对象,一个具有包含您的数据的地址 0x6e89010,另一个具有地址 0x6e88fb0,其中必填字段是 nil

此错误的来源必须包含在您未发布的代码中。

为了避免此类问题,我的建议是遵循 Apple 演示中也使用的以下设计模式:

  • 将托管对象上下文作为属性传递给模态视图控制器。建议只有一个托管对象上下文。
  • 当输入控制器以[NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:self.managedObjectContext];开头时创建一个新的托管对象
  • 当用户输入数据时,立即将属性/属性分配给您的新对象。
  • 当用户点击“保存”时,使用[self.managedObjectContext save:&amp;error]; 保存更改
  • 如果用户取消,使用[self.managedObjectContext deleteObject:insertedObject];从上下文中删除对象

这是非常有效的,并且倾向于避免杂散对象错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多