如何使用核心数据的添加和删除(NSSet)访问器方法?
Posted
技术标签:
【中文标题】如何使用核心数据的添加和删除(NSSet)访问器方法?【英文标题】:How to use core data's add & remove (NSSet) accessor methods? 【发布时间】:2012-06-15 20:28:06 【问题描述】:在这个测试核心数据项目中,我有一个从“客户”到“产品”的一对多关系,这种关系被命名为“产品”。客户的属性是“名称”,产品的属性是“项目”。我对实体进行了子类化,Xcode 为客户生成了以下内容:
@interface Customer : NSManagedObject
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSSet *products;
@end
@interface Customer (CoreDataGeneratedAccessors)
- (void)addProductsObject:(Products *)value;
- (void)removeProductsObject:(Products *)value;
- (void)addProducts:(NSSet *)values;
- (void)removeProducts:(NSSet *)values;
@end
假设要添加一个客户(John Doe)和两个项目(Widget 1 和 Widget 2),我可以使用访问器方法 addProductsObject,如下所示:
...
// Add (1) customer object
Customer *custObj = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
[custObj setValue:@"John Doe" forKey:@"name"];
// Add (2) products for John Doe
for (int foo=0; foo<2; foo++)
self.product = [NSEntityDescription insertNewObjectForEntityForName:@"Products" inManagedObjectContext:context];
NSString *objString = [NSString stringWithFormat:@"Widget %d", foo];
self.product.item = objString;
[custObj addProductsObject:self.product];
...
这很好用,但如果可能的话,我想使用 addProducts 访问器。
我假设生成的访问器方法 addProducts 可以方便地插入一组对象,例如:
...
NSSet *itemSet = [[NSSet alloc] initWithObjects:@"Widget 1", @"Widget 2", nil];
[custObj addProducts:itemSet];
...
但这失败了。在这次尝试中,我知道一个产品对象没有被显式创建,因此,一个显式的产品分配没有发生,但我认为,也许访问器会处理这个问题。
因此,addProducts 以及 removeProducts 的正确用法是什么?
谢谢。
【问题讨论】:
【参考方案1】:您传递给 addProducts 的集合包含 NSString,而不是 Products。
NSMutableSet* products = [NSMutableSet set];
Products* product = [NSEntityDescription insertNewObjectForEntityForName: @"Products" inManagedObjectContext: context];
product.item = @"Widget 1";
[products addObject: product];
product = [NSEntityDescription insertNewObjectForEntityForName: @"Products" inManagedObjectContext: context];
product.item = @"Widget 2";
[products addObject: product];
[customer addProducts: products];
本质上,访问者无法知道您首先给它的字符串是做什么用的。您必须提供包含正确类型实体的集合。
也就是说,您可以定义自己的访问器,获取一组字符串并在您的关系中插入正确初始化的产品:addProductsWithStrings:例如。
【讨论】:
以上是关于如何使用核心数据的添加和删除(NSSet)访问器方法?的主要内容,如果未能解决你的问题,请参考以下文章
如何在核心数据 NSManagedObject 关系的 NSSet 中添加或删除项目时触发通知?