具有一对多关系:xcdatamodel生成的类将具有:
@interface Department (CoreDataGeneratedAccessors)
- (void)addEmployeeObject:(Employee *)value;
- (void)removeEmployeeObject:(Employee *)value;
- (void)addEmployees:(NSSet *)value;
- (void)remove Employees:(NSSet *)value;
@end
'addEmployees'会替换集合中的所有现有项目还是会附加到现有列表?
Apple的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];
答案 0 :(得分:1)
澄清事情:接口中的所有方法都执行set操作,因为它们都引用了to-many关系。 addEmployeeObject:和addEmployees:之间的区别在于前者添加了单个对象,而后者同时添加了多个对象。执行的set操作在这种情况下设置为union,而对于removeEmployeeObject:和removeEmployees,它当然是设置差异。
为什么你不应该考虑附加已经存储的先前元素集合?因为Core Data使用NSSet(不同元素的集合)表示多对多关系,而不是NSCountedSet(可以包含重复元素的集合,也称为包)。并且因为集合是无序集合,因此“附加”没有意义(因为它代替数组或列表)。核心数据(正确)不允许重复元素存储在相同的多对多关系中,因此框架使用NSSet,它强制执行不同的元素(而NSCountedSet允许重复元素)。
最后,当您使用setEmployees:方法时,您将释放存储在多对多关系中的当前员工集,并将您作为参数传递的集保留在setEmployees:方法中。因此,您正在改变关系中存储的元素的一次性。它完全等同于首先删除存储在关系中的所有元素,然后添加新元素(当然假设它们都是不同的)。
答案 1 :(得分:0)
'addEmployee'会替换集合中的所有现有项目还是会附加到现有列表?
因为它需要NSSet*
,大概两者都没有,除非原始的Department
- 到 - Employee
关系集分别为空或与您添加的内容不相交。将这些核心数据方法视为执行set operations,而不是数组操作。
作为一个小问题,命名约定是用复数形式的实体名词命名多对多关系(即你可以将employee
更改为employees
)。对于任何查看您的方法和核心数据模型的人来说,这都会更有意义。