iOS - Основные данные - Удалить записи, используя отношения и запрос на выборку

Обзор:

У меня есть проект iOS, в котором я использую основные данные

  • у меня есть Employees сущность и Department юридическое лицо.
  • 1 отдел может содержать много сотрудников
  • Таким образом, сущность Department имеет отношение ко многим Employeesотношения называются employees и обратная связь называется whichDepartment

Цель-1:

Я хочу удалить всех сотрудников в определенном отделе

Вопросы:

а) верно ли следующее, или это вызовет мутацию или некоторые проблемы?

б) это правильный способ сделать это?

Пожалуйста, обратите внимание - removeEmployees это метод, который был автоматически сгенерирован при создании подклассов сущностей

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

Цель-2:

  • Я хочу удалить сотрудников на основании какого-либо условия
  • Я удаляю объекты в быстром цикле перечисления для извлеченных записей

Вопросы:

в) Правильно ли следующее, или это может вызвать мутацию?

г) Это как модифицировать объект в быстром перечислении?

д) Есть ли лучший способ сделать это?

Пожалуйста, обратите внимание - 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];
    }
}

1 ответ

Во-первых, в вашем deleteAllEmployeesForDepartment: Это нормально, чтобы удалить объекты таким образом.

Если, кроме того, вы хотите удалить объекты Employees из Базовых данных, вам следует добавить еще одно правило - правило удаления, установленное в каскад, то есть при Employee "потери" Department (отношения нарушены, либо Department удаляется, или Department удаление Employee) это (Employee) также удаляется.

Ваш второй вопрос немного интереснее.

Я рекомендую добавить другой метод непосредственно в подкласс Департамента NSManagedObejectВы могли бы назвать это - clearEmployeesOfType: передавая номер типа.

Так как ваш Department имеет ссылку на NSSet из 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];
}

Я бы рекомендовал это решение, а не загружать объекты и удалять их один за другим, когда это возможно, полагаться на отношения и удалять правила в Базовых данных.

Другие вопросы по тегам