Ошибка связи с iPhone Core Data - PullRequest
4 голосов
/ 26 июня 2010

Я создаю приложение 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"]].

Вот часть первого вывода 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 - ошибка.Аналогично, в контроллере push-представления сущность Items передается, но Item_to_item_comments - нет.

Я думаю, что упускаю что-то очевидное, но после дня, потраченного на эту проблему, я не могу понятьиз.

Буду признателен за любую помощь.

Петр

1 Ответ

9 голосов
/ 26 июня 2010

«Ошибка» не означает ошибку, это просто означает, что возвращаемый объект является «призраком» без считывания его атрибутов. Нормально получать ошибки для другой стороны отношений, потому что извлечь для запуска неконтролируемый каскад создания объекта через его отношения.

Когда вы получаете доступ к атрибуту ошибки, он будет рассматриваться как полностью функциональный объект.

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 до получения. Следующий NSLog (предположительно) регистрирует результаты после выборки. Это означает, что вы смотрите на два разных набора объектов в двух разных состояниях ошибки.

У вас также может быть проблема, потому что mutableItemsFetchResults, очевидно, является свойством, но вы не используете нотацию self.mutableItemsFetchResults, чтобы убедиться, что оно правильно сохранено. Кроме того, я не думаю, что вам нужно mutableCopy.

...