概述:
我有一个使用核心数据的iOS项目
Employees实体和一个Department实体,Department与实体Employees有"to多“关系,这种关系称为employees,反向关系被称为Employees。Aim-1:
我要删除某一部门的所有员工。
问题:
( a)以下内容是正确的,还是会引起突变或一些问题?
( b)这是正确的做法吗?
Pls Note - removeEmployees是在创建实体的子类时自动生成的方法。
- (void) deleteAllEmployeesForDepartment: (Department*) requestedDepartment
{
[requestedDepartment removeEmployees:requestedDepartment.employees];
}Aim-2:
的快速枚举循环中的对象
问题:
( c)以下是正确的,还是会引起某些突变?
( d)是否类似于在快速枚举中修改对象?
( e)是否有更好的办法来做到这一点?
Pls Note - removeEmployees是在创建实体的子类时自动生成的方法。
- (void) deleteAllType1EmployeesWithDepartment: (Department*) requestedDepartment
{
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"type == %i AND whichDepartment ==%i", 1, requestedDepartment.departmentID];
NSError *error;
NSArray *listOfEmployeesToBeDeleted = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
for(Employees *currentEmployee in listOfEmployeesToBeDeleted)
{
[self.managedObjectContext deleteObject:currentEmployee];
}
}发布于 2012-05-12 02:11:54
首先,在您的deleteAllEmployeesForDepartment:中,这样删除对象是很好的。
此外,如果要从核心数据中删除员工对象,则应该添加另一条规则,即设置为级联的删除规则,这意味着当Employee“丢失”一个Department (关系被Department删除,或Department删除Employee)时,它( Employee)也被删除。
你的第二个问题更有趣。
我建议的是将另一个方法直接添加到NSManagedObeject的Department子类中,您可以将其称为-传递类型号的clearEmployeesOfType:。
由于您的Department通过to -多关系引用了NSSet of Employees,所以您可以使用NSSet和filteredSetUsingPredicate:方法筛选出您想要的关系。
返回集可用于在您的removeEmployees:上传递Department方法,类似于以下内容(警告,代码未测试)。
- (void) clearEmployeesOfType:(NSUInteger)type
{
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"SELF.type == %d", type];
NSSet * firedEmployees = [self.employees filteredSetUsingPredicate:predicate];
[self removeEmployees:firedEmployees];
}我推荐这个解决方案,而不是加载对象,然后一个接一个地删除对象,只要有可能,就依赖关系并删除Core数据中的规则。
https://stackoverflow.com/questions/10560406
复制相似问题