0

概述:

我有一个使用核心数据的 iOS 项目

  • 我有一个Employees实体和一个Department实体。
  • 1个部门可以包含很多员工
  • 所以实体与实体Department之间存在“对多”关系Employees,这种关系称为关系employees,反向关系称为whichDepartment

目标一:

我想删除特定部门的所有员工

问题:

a) 以下是正确的,还是会导致突变或一些问题?

b)这是正确的方法吗?

请注意-removeEmployees是在创建实体的子类时自动生成的方法

- (void) deleteAllEmployeesForDepartment: (Department*) requestedDepartment
{
    [requestedDepartment removeEmployees:requestedDepartment.employees];
}

目标2:

  • 我想根据某些条件删除员工
  • 我正在为获取的记录删除快速枚举循环中的对象

问题:

c)以下是正确的,还是会导致一些突变?

d) 是否像在快速枚举中修改对象?

e) 有更好的方法吗?

请注意-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];
    }
}
4

1 回答 1

0

首先,在您的情况下,以deleteAllEmployeesForDepartment:这种方式删除对象很好。

如果您还想从 Core Data 中删除 Employees 对象,那么您应该添加另一个规则,将删除规则设置为cascade,这意味着当Employee“丢失” a时Department(关系被破坏,要么是Department被删除,要么是Department删除Employee),它 (the )Employee也被删除。

你的第二个问题更有趣一点。

我建议将另一种方法直接添加到 Department 的子类中NSManagedObeject,您可以调用它 -clearEmployeesOfType:传递类型编号。

由于您通过一对多关系Department引用了NSSetof ,因此您可以使用它,并且它是过滤掉您想要的那些的方法。EmployeesNSSetfilteredSetUsingPredicate:

返回集可用于向removeEmployees:您的方法发送消息Department,有点像以下(警告,代码未测试)。

- (void) clearEmployeesOfType:(NSUInteger)type
{ 
    NSPredicate * predicate = [NSPredicate predicateWithFormat:@"SELF.type == %d", type];
    NSSet * firedEmployees = [self.employees filteredSetUsingPredicate:predicate];

    [self removeEmployees:firedEmployees];
}

我会推荐这个解决方案,而不是加载对象并一一删除它们,只要可以,依赖关系并删除 Core Data 中的规则。

于 2012-05-12T02:11:54.190 回答