【问题标题】:iOS - Core Data - Delete records using relationships and fetch requestiOS - 核心数据 - 使用关系和获取请求删除记录
【发布时间】:2012-05-12 01:48:35
【问题描述】:

概述:

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

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

目标 1:

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

问题:

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];
    }
}

【问题讨论】:

    标签: ios core-data fast-enumeration mutation


    【解决方案1】:

    首先,在您的deleteAllEmployeesForDepartment: 中,可以这样删除对象。

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

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

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

    由于您的Department 通过多对多关系引用EmployeesNSSet,您可以使用NSSetfilteredSetUsingPredicate: 方法来过滤掉您想要的。

    返回集可用于向您的Department 上的removeEmployees: 方法发送消息,类似于以下内容(警告,代码未经测试)。

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

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

    【讨论】:

    • 感谢 Daniel,我刚刚测试了 deleteAllEmployeesForDepartment 和 clearEmployeesOfType 方法。这两种方法似乎都导致whichDepartment(关系)字段变为NULL。我认为造成这种情况的原因可能是因为内部快速枚举或类似的东西可能用于循环遍历 NSSet,并且从用于快速枚举的同一集中删除对象会导致这种情况发生。但是,获取请求并遍历它们并使用 deleteObject 似乎可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多