Core data 为什么CoreData会与“崩溃”;“无法识别的选择器”;当我试着建立关系的时候?

Core data 为什么CoreData会与“崩溃”;“无法识别的选择器”;当我试着建立关系的时候?,core-data,nsfetchrequest,Core Data,Nsfetchrequest,我在一个名为“Item”的CoreData实体中有一个简单的树结构 任何项都可以是另一项的父项,并且可以有多个子项 实体中存在以下关系: 子项:对多个,目标:项,反向:父项。可选择的 父项:目的地:项,反向:子项。可选的 我正在使用Xcode生成以下项。h: @interface Item : NSManagedObject { } @property (nonatomic, retain) NSString * title; @property (nonatomic, retain)

我在一个名为“Item”的CoreData实体中有一个简单的树结构

任何项都可以是另一项的父项,并且可以有多个子项

实体中存在以下关系:

子项:对多个,目标:项,反向:父项。可选择的 父项:目的地:项,反向:子项。可选的

我正在使用Xcode生成以下项。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;
})
***-[Item addChildItemsObject:]:发送到实例0x5494140的选择器无法识别
(gdb)采购订单0x5494140
(实体:项;id:0x54921d0;数据:{
title=Test123;
})
我可以很好地设置或获取其他属性。但当我试图改变关系时,它崩溃了。
我做错了什么?

我猜这是由于使用“Item”这样的通用词作为类名而导致的命名冲突。尝试将名称重构为更独特的名称

或者,您可以尝试验证类是否响应方法:

Item *item = [itemFetchedResultsController.fetchedObjects objectAtIndex:0];
NSLog(@"responds=%@",[item respondsToSelector:@selector(addChildItemsObject:)] ?@"YES":@"NO");
[item addChildItemsObject:childItem];
或者调查直接返回的对象的类:

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

有可能您实际返回的是一个通用的NSManagedObject,它正在被静默地转换为它的Item子类。不太可能,不过你不妨检查一下

找到了问题的原因

CoreData模型和数据类只有在项目内部时才起作用。 如果你把它们放在依赖项目中,它会有上面提到的奇怪错误

My.xcdatamodel和entity类位于其他项目中,其他项目添加到主项目中


一旦我将所有内容都移动到主项目中并删除依赖项,它就可以正常工作。

childItem来自哪里?是否有可能是您试图制作的同一物品的父项?