iPhone核心数据关系错误

时间:2010-06-26 13:01:44

标签: 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];

当用户点击一行时,我选择特定的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];
}

在第一个块中,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})",

您可以看到提取了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;

})

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

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

任何帮助都将不胜感激。

彼得

1 个答案:

答案 0 :(得分:9)

“错误”并不意味着错误,它只是意味着返回的对象是一个没有读取属性的“幽灵”。为关系的另一方获取错误是正常的,因为你不是什么获取通过其关系引发不受控制的对象创建级联。

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

编辑:

来自评论:

  

问题是我要求了   这种关系通过NSLog,但我   仍然无法得到关系   实体。

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

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

NSLog(@"itemObject.Item_to_item_comments: %@", [mutableItemsFetchResults objectAtIndex:indexPath.row].Item_to_item_comments.someAttribute]);

你还有一个问题就是你正在比较两个单独提取的结果。这样:

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

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

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