iOS Core Data - 将相关数据添加到实体

Posted

技术标签:

【中文标题】iOS Core Data - 将相关数据添加到实体【英文标题】:iOS Core Data - Add related data to entity 【发布时间】:2013-10-10 09:54:19 【问题描述】:

这里是 ios 初学者。

给定一个具有多对多关系的实体

@class Categories;

@interface Events : NSManagedObject

@property (nonatomic, retain) NSString * title;
@property (nonatomic, retain) NSSet *categories;
@end

@interface Events (CoreDataGeneratedAccessors)

- (void)addCategoriesObject:(Categories *)value;
- (void)removeCategoriesObject:(Categories *)value;
- (void)addCategories:(NSSet *)values;
- (void)removeCategories:(NSSet *)values;

@end

跟什么有关

@interface Categories : NSManagedObject

@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSManagedObject *events;

@end

还有一些 JSON 数据来填充事件表

["title": "Test Exhibition", "categories": ["name": "Exhibitions"], ...]

我应该如何格式化 JSON 数据以执行类似的操作

// Parse Events JSON
[events enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) 
...
Events *event = [NSEntityDescription
    insertNewObjectForEntityForName:@"Events" inManagedObjectContext:context];
event.title = [obj objectForKey:@"title"];
NSSet *categories = [[[NSSet alloc] init] setByAddingObjectsFromArray:[obj objectForKey:@"categories"]];
NSLog(@"CATS %@", categories);
[event addCategories:categories];

最终让Core Data找到相关的Category(已经添加到数据库中)并将其附加到Event?

此刻我得到

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary entity]: unrecognized selector sent to instance 0x893a8c0'

任何帮助将不胜感激,谢谢!

【问题讨论】:

每当您收到unrecognized selector 错误时,请始终使用调试器检查您要向其发送消息的对象是否属于您期望的类型。 【参考方案1】:

categoriesNSSetNSDictionaries,但是

- (void)addCategories:(NSSet *)values;

预计 NSSetNSManagedObject's。因此,您必须从每个描述类别的字典中创建一个 NSManagedObject,将它们添加到新的 NSSet(或 NSMutableSet),然后才使用新集合调用 addCategories:

【讨论】:

那么除了在事件循环中执行获取请求以查找相关类别(或添加新类别)之外别无他法? 没错。您可以通过批量查询类别来最大限度地减少对持久存储的命中次数。请参阅Importing Large Data Sets 上标题为“高效导入”的部分。如果您这样做,您将对每个事件的类别进行一次查询。 感谢您为我指明了正确的方向并帮助我意识到高效地实施查找或创建是关键developer.apple.com/library/ios/documentation/cocoa/conceptual/…

以上是关于iOS Core Data - 将相关数据添加到实体的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Core Data 添加到已经创建的 iOS 项目中

由于 NSSQLiteErrorDomain = 1032,iOS Core Data saveContext 方法不成功

IOS/objective-c/core-data:如何从相关实体获取属性

在 Core Data (IOS) 中保存数据时出错

与 Core Data 相关的 Cocoa 错误 19

将数据从Core Data加载到Today Widget