2010-07-05 8 views
0

J'ai une structure arborescente simple dans une entité CoreData appelée "Item".Pourquoi CoreData se bloque avec "sélecteur non reconnu" lorsque j'essaie de définir une relation?

Tout article peut être parent d'un autre article et peut avoir plusieurs enfants.

Il y a des relations suivantes dans l'entité:

childItems: A Many, Destination: Point, inverse: parentItem. optionnel parentItem: Destination: Elément, inverse: childItems. option

J'utilise Xcode généré suivant Item.h:

@interface Item : NSManagedObject 
{ 
} 

@property (nonatomic, retain) NSString * title; 

@property (nonatomic, retain) Item * parentItem; 
@property (nonatomic, retain) NSSet* childItems; 


@end 


@interface Item (CoreDataGeneratedAccessors) 
- (void)addChildItemsObject:(Item *)value; 
- (void)removeChildItemsObject:(Item *)value; 
- (void)addChildItems:(NSSet *)value; 
- (void)removeChildItems:(NSSet *)value; 

@end 

La demande de récupération est très simple:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription 
    entityForName:@"Item" inManagedObjectContext:[self managedObjectContext]]; 
[fetchRequest setEntity:entity];  
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:NO]; 

[fetchRequest setSortDescriptors:[NSArray arrayWithObjects: sort, nil]]; 
[fetchRequest setFetchBatchSize:20]; 

NSFetchedResultsController *theFetchedResultsController = 
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
     managedObjectContext:[self managedObjectContext] sectionNameKeyPath:nil 
     cacheName:@"AllItemsCache"]; 

Lorsque je tente de mettre en relation, il se bloque tout simplement. Pourquoi?

Item *item = [itemFetchedResultsController.fetchedObjects objectAtIndex:0]; 
[item addChildItemsObject:childItem]; 

sortie de débogage:

*** -[Item addChildItemsObject:]: unrecognized selector sent to instance 0x5494140 

(gdb) po 0x5494140 
<Item: 0x5494140> (entity: Item; id: 0x54921d0 <x-coredata://AB862620-04BE-4E42-84A6-8723455F5957/Item/p1> ; data: { 
    title = Test123; 
}) 

Je peux définir ou obtenir d'autres propriétés très bien. mais quand j'essaie de changer de relation, ça plante. Qu'est-ce que je fais de mal?

+0

D'où vient childItem? Y a-t-il une chance que ce soit le même élément que vous essayez d'en faire un parent? – theMikeSwan

Répondre

1

Je suppose que c'est une collision nommée causée par l'utilisation d'un mot générique comme "Item" comme nom de classe. Essayez de refactoriser le nom pour quelque chose de plus unique.

Alternativement, vous pouvez essayer de vérifier que la classe ne répond à la méthode:

Item *item = [itemFetchedResultsController.fetchedObjects objectAtIndex:0]; 
NSLog(@"responds=%@",[item respondsToSelector:@selector(addChildItemsObject:)] [email protected]"YES":@"NO"); 
[item addChildItemsObject:childItem]; 

ou enquêter sur la classe de l'objet directement rapatriées:

NSLog(@"class=%@",[[itemFetchedResultsController.fetchedObjects objectAtIndex:0] class]); 

Il est possible que votre retour en fait un générique NSManagedObject qui est converti silencieusement en sa sous-classe Item. Peu probable, mais vous pourriez aussi bien vérifier.

1

Trouvé la cause du problème.

Le modèle CoreData et les classes de données fonctionnent uniquement s'ils se trouvent dans votre projet. Si vous les mettez dans un projet dépendant, il aura les erreurs étranges comme ci-dessus. Mes classes .xcdatamodel et entity étaient dans d'autres projets et d'autres projets ajoutés au projet principal.

Dès que j'ai déplacé tout dans le projet principal et la dépendance enlevée cela fonctionne très bien.