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];
}
Я бы рекомендовал это решение, а не загружать объекты и удалять их один за другим, когда это возможно, полагаться на отношения и удалять правила в Базовых данных.