使用一对多关系:从xcdatamodel生成的类将具有:
@interface Department (CoreDataGeneratedAccessors)
- (void)addEmployeeObject:(Employee *)value;
- (void)removeEmployeeObject:(Employee *)value;
- (void)addEmployees:(NSSet *)value;
- (void)remove Employees:(NSSet *)value;
@end'addEmployees‘会替换集合中的所有现有项目,还是会追加到现有列表中?
苹果的CoreData编程指南指出,你可以“像处理一对一关系一样处理整个多对多关系”,并使用'setEmployees‘而不是我生成的类所具有的'addEmployees’来演示它。
NSSet *newEmployees = [NSSet setWithObjects:employee1, employee2, nil];
[aDepartment setEmployees:newEmployees];
NSSet *newDirectReports = [NSSet setWithObjects:employee3, employee4, nil];
manager.directReports = newDirectReports;
// for adding single elements
NSMutableSet *employees = [aDepartment mutableSetValueForKey:@"employees"];
[employees addObject:newEmployee];
[employees removeObject:firedEmployee];
// or
[aDepartment addEmployeesObject:newEmployee];
[aDepartment removeEmployeesObject:firedEmployee];发布于 2009-09-24 05:45:26
澄清一下:接口中的所有方法都执行set操作,因为它们都引用了一种多对多的关系。addEmployeeObject:和addEmployees:的区别在于前者添加单个对象,而后者同时添加多个对象。在本例中,执行的设置操作是设置联合,而对于removeEmployeeObject:和removeEmployees,它当然是设置差异。
为什么你不应该从附加到之前已经存储的元素集合的角度来考虑这个问题呢?因为核心数据使用NSSet (不同元素的集合)表示多对多关系,而不是NSCountedSet (可以包含重复元素的集合,也称为包)。因为一个集合是一个无序的集合,所以“追加”没有意义(就像数组或列表一样)。核心数据(正确地)不允许在同一对多关系中存储重复的元素,因此框架使用NSSet,它强制不同的元素(而NSCountedSet允许重复的元素)。
最后,当您使用setEmployees:方法时,您将释放存储在对多关系中的当前员工集,并保留您作为参数传递给setEmployees:方法的那组员工。因此,您将一次性更改存储在关系中的元素。这完全等同于首先删除存储在关系中的所有元素,然后添加新的元素(当然,假设它们都是不同的)。
发布于 2009-09-23 22:35:18
'addEmployee‘会替换集合中的所有现有项目,还是会追加到现有列表中?
因为它需要一个NSSet*,假设两者都不是,除非原始的Department - to - Employee关系集是空的或与您要添加的内容不相交。可以将这些核心数据方法看作是执行set operations,而不是数组操作。
顺便提一下,命名约定是使用实体名词的复数形式命名对多关系(即,您可以将employee更改为employees)。这对其他任何关注你的方法和核心数据模型的人来说都更有意义。
https://stackoverflow.com/questions/1467918
复制相似问题