2010-07-05 15 views
0

我在一个名为“Item”的CoreData实体中有简单的树结构。为什么当我尝试设置关系时CoreData与“无法识别的选择器”崩溃?

任何项目都可以是其他项目的父项目,并且可以有多个子项目。

有下面的实体关系:

childItems:一对多,目标:项目,逆:parentItem。可选 parentItem:Destination:Item,inverse:childItems。可选

我使用的Xcode生成以下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 

获取请求非常简单:

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"]; 

当我尝试设置关系,它只是崩溃。为什么?

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

调试输出:

*** -[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; 
}) 

我可以设置或获取其他属性就好了。但是当我尝试改变关系时,它会崩溃。 我在做什么错?

+0

childItem从哪里来?是否有机会尝试使它成为父项? – theMikeSwan 2010-07-05 18:00:54

回答

1

我猜想这是一个命名冲突引起的使用像“Item”这样的通用词作为类名。尝试重构名称以更独特。

或者,你可以尝试验证类不回应方法:

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

或调查对象的类直接返回:

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

这有可能是你实际上返回通用NSManagedObject被默默地转换为它的Item子类。不太可能,但你不妨检查一下。

1

找到问题的原因。

CoreData模型和数据类只有在它们在您的项目中时才有效。 如果你把它们放到依赖项目中,它会出现像上面这样的奇怪错误。

我的.xcdatamodel和实体类在其他项目和其他项目添加到主项目。

只要我将所有东西都移到主项目中,并删除了依赖项,它就可以正常工作。

相关问题