iPhone核心数据关系故障

2024-01-22

我正在构建一个核心数据 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];

当用户点击一行时,我选择特定的实体,将其传递给 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"]],也没有检索到“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;

})

Now, Item_to_item_comments是错。类似地,在推送的视图控制器中,传递了 Items 实体,但是Item_to_item_comments is not.

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

任何帮助,将不胜感激。

Peter


“故障”并不意味着错误,它只是意味着返回的对象是一个“幽灵”,没有读入其属性。关系的另一方出现故障是正常的,因为您不知道要设置什么通过其关系进行不受控制的对象创建级联。

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

Edit:

来自评论:

问题是我要求 通过 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 before发生提取。下一个 NSLog(大概)记录提取后的结果。这意味着您可能正在查看处于两种不同故障状态的两组不同对象。

您可能还会遇到问题,因为mutableItemsFetchResults显然是一个属性,但你没有使用self.mutableItemsFetchResults符号以确保它被正确保留。另外,我认为你不需要mutableCopy.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iPhone核心数据关系故障 的相关文章

随机推荐