CoreData 1570错误代码

时间:2011-10-22 19:52:47

标签: objective-c ios xcode core-data

目前我的所有保存都将转到内存但未写入磁盘(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.)}

2 个答案:

答案 0 :(得分:24)

答案 1 :(得分:1)

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

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

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

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

这非常有效,并且可以避免杂散对象错误。