2010-06-26 5 views
4

Je construis une application iphone de données de base, et j'ai du mal à récupérer de nombreuses données de relation. S'il vous plaît, supportez-moi pendant que je vous explique.iPhone Core Erreur de relation de données

J'ai utilisé le concepteur de modèle de données pour configurer une entité appelée "Item" qui contient de nombreuses entités appelées "Comment". Je récupère ensuite plusieurs entités et les affiche dans un UITableView. Je vais chercher ces entités comme celui-ci (dans la méthode 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]; 

Lorsque les robinets de l'utilisateur sur une ligne, je choisi le entiny particulier, passer à un nouveau contrôleur de vue de la table dans sa méthode d'initialisation, et appuyez sur la nouvelle vue contrôleur à la pile:

- (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]; 
} 

dans le premier bloc de la sortie NSLog montre que les « Item_to_item_comments » entités de relations ont été récupérées, mais dans la seconde, qu'il n'était pas même si j'invoqué la demande [setRelationshipKeyPathsForPrefetching: [NSArray arrayWithObject: @ "Item_to_item_comments"]].

Voici une partie de la première sortie 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})", 

Vous pouvez voir que les entités d'articles sont extraites, y compris Item_to_item_comments. Voici la deuxième 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; 

}) 

Maintenant, Item_to_item_comments est la faute. De même, dans le contrôleur de vue poussée, l'entité Items est transmise, mais Item_to_item_comments ne l'est pas.

Je pense qu'il me manque quelque chose d'évident, mais après une journée passée sur ce problème, je ne peux pas le comprendre.

Toute aide serait appréciée.

Peter

Répondre

9

Une « faute » ne signifie pas une erreur, cela signifie simplement que l'objet retourné est un « fantôme » sans ses attributs lues. Il est normal d'obtenir des défauts de l'autre côté de la relation parce que vous ne faites pas quoi chercher pour déclencher une cascade incontrôlée de création d'objet via ses relations.

Lorsque vous accédez à un attribut de l'erreur, il est considéré comme un objet entièrement fonctionnel.

Edit:

De commentaire:

Le problème est que je demande cette relation par NSLog, mais je ne peux toujours pas la relation entités.

Non, vous ne l'êtes pas. Il vous suffit de demander les entités Items elles-mêmes, puis de les consigner. Ils retournent des fautes pour leurs relations comme prévu. Ce n'est que si vous demandez à chacun l'objet réel de l'autre côté de la relation que vous êtes assuré de voir un objet au lieu d'un défaut.

C'est ce que vous devez forcer la formation de failles dans des objets dans la relation:

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

Vous êtes autre problème est que vous comparez les résultats de deux fetch séparés. Ce:

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

... enregistre le mutableItemsFetchResultsavant l'opération d'extraction se produit. Le prochain NSLog (vraisemblablement) enregistre les résultats après le fetch. Cela signifie que vous envisagez deux ensembles d'objets différents dans deux états d'erreur différents.

Vous avez peut-être aussi un problème car mutableItemsFetchResults est apparemment une propriété mais vous n'utilisez pas la notation self.mutableItemsFetchResults pour vous assurer qu'elle est correctement conservée. En outre, je ne pense pas que vous avez besoin de mutableCopy.

+0

Je comprends que les données de base ne chargent pas les relations "à-plusieurs" tant qu'elles ne sont pas demandées. Le problème est que je demande une telle relation via NSLog, mais je ne peux toujours pas obtenir les entités relationnelles. J'espère que mon explication de ce problème est adéquate. Merci encore. – futureshocked

+0

Voir ma modification pour une extension. – TechZen

+0

Merci, c'est une aide précieuse, logique. Erreur débutant! – futureshocked

Questions connexes