我在一个名为“Item”的CoreData实体中有简单的树结构。
任何项目都可以是其他项目的父项,并且可以有多个子项目。
实体中存在以下关系:
childItems:To-Many,Destination:Item,inverse:parentItem。可选的 parentItem:Destination:Item,inverse:childItems。可选的
我正在使用以下Item.h生成的Xcode:
@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 :(得分:1)
我猜这是一个命名冲突,因为使用像“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]);
您实际可能会返回一个静默地强制转换为其Item子类的通用NSManagedObject。不太可能,但你不妨检查一下。
答案 1 :(得分:1)
找到问题的原因。
CoreData模型和数据类仅在项目内部有效。 如果你将它们放入依赖项目中,它将会出现如上所述的奇怪错误。
我的.xcdatamodel和实体类在其他项目和其他项目中添加到主项目中。
只要我将所有内容都移到主项目中并删除依赖项,它就可以正常工作。