我正在构建一个核心数据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
不是。
我认为我错过了一些明显的东西,但经过一天花在这个问题上,我无法弄清楚。
任何帮助都将不胜感激。
彼得
答案 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
。