iPhone核心数据关系错误

fut*_*ked 4 cocoa core-data relationship fault

我正在构建核心数据iphone应用程序,并且无法检索一对多的关系数据.我解释时请耐心等待.

我使用数据模型设计器来设置一个名为"Item"的实体,其中包含许多名为"Comment"的实体.然后我检索多个实体并将其显示在一个UITableView.我像这样获取这些实体(在viewDidLoad方法中):

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Items" inManagedObjectContext:self.managedObjectContext];
[request setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(Item_to_Areas.Name LIKE %@)",[areaManagedObject valueForKey:@"Name"]];
[request setPredicate:predicate];
[request setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObject:@"Item_to_item_comments"]];
NSLog(@"Results: %@", [mutableItemsFetchResults description]);
mutableItemsFetchResults = [[managedObjectContext executeFetchRequest:request error:nil] mutableCopy];
[request release];
Run Code Online (Sandbox Code Playgroud)

当用户点击一行时,我选择特定的entiny,在其init方法中将其传递给新的表视图控制器,并将新的视图控制器推送到堆栈:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"itemObject: %@", [mutableItemsFetchResults objectAtIndex:indexPath.row]);
InspectionItemCommentsViewController *itemCommentsViewController =     [[InspectionItemCommentsViewController alloc]
                                                                initWithManagedObjectContext:self.managedObjectContext 
                                                                itemObject:[mutableItemsFetchResults objectAtIndex:indexPath.row]];
itemCommentsViewController.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:itemCommentsViewController animated:YES];
[itemCommentsViewController release];
}
Run Code Online (Sandbox Code Playgroud)

在第一个块中,NSLog输出显示检索到"Item_to_item_comments"关系实体,但在第二个块中,即使我调用了[request setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObject:@"Item_to_item_comments"]].

这是第一个NSLog输出的一部分:

Results: (
"<NSManagedObject: 0xb356b70> (entity: Items; id: 0xb34fe60 <x-coredata://E43A90B5-AF0E- 4394-B4A7-5EFE74E181F8/Items/p1> ; data: {\n    Clean = nil;\n    Description = \"\";\n    ItemToInformation = \"<relationship fault: 0x5e1ef00 'ItemToInformation'>\";\n    \"Item_to_Areas\" = \"0xb33fd30 <x-coredata://E43A90B5-AF0E-4394-B4A7-5EFE74E181F8/Areas/p1>\";\n    \"Item_to_item_comments\" = \"<relationship fault: 0x5e1d300 'Item_to_item_comments'>\";\n    Keys = nil;\n    Name = Other;\n    \"Tenant_agrees\" = nil;\n    Undamaged = nil;\n    Working = nil;\n})",
"<NSManagedObject: 0xb35a930> (entity: Items; id: 0xb32acc0 <x-coredata://E43A90B5-AF0E-4394-B4A7-5EFE74E181F8/Items/p2> ; data: {\n    Clean = nil;\n    Description = \"\";\n    ItemToInformation = \"<relationship fault: 0x790de40 'ItemToInformation'>\";\n    \"Item_to_Areas\" = \"0xb33fd30 <x-coredata://E43A90B5-AF0E-4394-B4A7-5EFE74E181F8/Areas/p1>\";\n    \"Item_to_item_comments\" =     (\n        \"0xb35bcb0 <x-coredata://E43A90B5-AF0E-4394-B4A7-5EFE74E181F8/Item_Comments/p13>\",\n        \"0xb35bcd0 <x-coredata://E43A90B5-AF0E-4394-B4A7-5EFE74E181F8/Item_Comments/p37>\",\n        \"0xb35bca0 <x-coredata://E43A90B5-AF0E-4394-B4A7-5EFE74E181F8/Item_Comments/p5>\",\n        \"0xb35bcc0 <x-coredata://E43A90B5-AF0E-4394-B4A7-5EFE74E181F8/Item_Comments/p26>\"\n    );\n    Keys = nil;\n    Name = Lights;\n    \"Tenant_agrees\" = nil;\n    Undamaged = nil;\n    Working = nil;\n})",
Run Code Online (Sandbox Code Playgroud)

您可以看到提取了Items实体,包括Item_to_item_comments.这是第二个NSLog:

itemObject: <NSManagedObject: 0xe20af50> (entity: Items; id: 0xe209fc0 <x- coredata://E43A90B5-AF0E-4394-B4A7-5EFE74E181F8/Items/p2> ; data: {
    Clean = nil;
    Description = "";
    ItemToInformation = "<relationship fault: 0xe302e40 'ItemToInformation'>";
    "Item_to_Areas" = "0xe500b90 <x-coredata://E43A90B5-AF0E-4394-B4A7-5EFE74E181F8/Areas/p1>";
    "Item_to_item_comments" = "<relationship fault: 0xe302e60 'Item_to_item_comments'>";
    Keys = nil;
    Name = Lights;
    "Tenant_agrees" = nil;
    Undamaged = nil;
    Working = nil;

})
Run Code Online (Sandbox Code Playgroud)

现在,Item_to_item_comments是错.类似地,在推送视图控制器中,Items实体被传递,但Item_to_item_comments不是.

我想我错过了一些明显的东西,但经过一天花在这个问题上,我无法弄清楚.

任何帮助,将不胜感激.

彼得

Tec*_*Zen 9

"错误"并不意味着错误,它只是意味着返回的对象是一个"幽灵"而没有读入其属性.为关系的另一方获取错误是正常的,因为你没有设置的提取通过其关系从一个不受控制的对象创建级联.

当您访问故障的属性时,它将作为一个功能齐全的对象出现故障.

编辑:

来自评论:

问题是我通过NSLog请求这种关系,但我仍然无法获得关系实体.

不你不是.您只是请求Items实体本身然后记录它们.他们按照预期为他们的关系返回错误.只有当你问每个人在关系另一边的实际对象时,你才能保证看到一个对象而不是一个错误.

这就是你需要强制关系中对象的错误:

NSLog(@"itemObject.Item_to_item_comments: %@", [mutableItemsFetchResults objectAtIndex:indexPath.row].Item_to_item_comments.someAttribute]);
Run Code Online (Sandbox Code Playgroud)

你的另一个问题是你要比较两个单独提取的结果.这个:

NSLog(@"Results: %@", [mutableItemsFetchResults description]);
mutableItemsFetchResults = [[managedObjectContext executeFetchRequest:request error:nil] mutableCopy];
Run Code Online (Sandbox Code Playgroud)

... 在获取mutableItemsFetchResults 之前记录.下一个NSLog(可能)在获取后记录结果.这意味着您可能会在两种不同的故障状态下查看两组不同的对象.

您可能也有问题,因为mutableItemsFetchResults它显然是一个属性,但您没有使用该self.mutableItemsFetchResults表示法来确保它被正确保留.另外,我认为你不需要mutableCopy.