2009-10-23 8 views
11

부서 및 직원이 있고 각 부서에는 여러 직원이 있지만 각 직원은 여러 부서에 속할 수 있다고 가정 해보십시오.핵심 데이터 삭제 규칙 및 다 대다 관계

따라서 직원과 부서 간에는 다 대다 관계가 있습니다. 부서를 삭제할 때 해당 부서의 일부인 모든 직원을 삭제하고 다른 부서의 구성원 인 모든 직원에 대해이 부서와의 관계를 무효화하고 싶습니다.

양방향 캐스케이드 규칙을 사용합니까? 또는 계단식 규칙은 다른 제휴 관계없이 부서의 모든 직원을 자동으로 삭제합니까?

답변

21

캐스케이드 규칙은 대상에서 자동으로 개체를 삭제합니다. 따라서 부서를 삭제하면 해당 부서의 수에 관계없이 직원이 삭제됩니다.

"고아가 된"직원 만 삭제하면 더 이상 미묘한 차이가 나는 것처럼 들리지만, - 즉 부서가없는 사람들. 부서를 삭제하면 해당 부서를 찾는 좋은 방법은 다음과 같이 수행하는 것입니다.

NSManagedObject *doomedDepartment = // get the department to be deleted 

NSSet *employees = [doomedDepartment valueForKey:@"employees"]; 
NSSet *orphanedEmployees = [employees filteredSetUsingPredicate:[NSPredicate predicateWithFormat:@"[email protected] == 1"]]; 
for (NSManagedObject *orphanedEmployee in orphanedEmployees) { 
    [managedObjectContext deleteObject:orphanedEmployee]; 
}  

[managedObjectContext deleteObject:doomedDepartment]; 
5

감사합니다. 아마도 그렇게 할 것입니다.

[[NSNotificationCenter defaultCenter] addObserver:self 
      selector:@selector(managedObjectContextDidChange:) 
      name:NSManagedObjectContextObjectsDidChangeNotification 
      object:managedObjectContext]; 

2.) 변경이 발생할 때 직원이 업데이트되는 :

1.) 변경에 대한 알림을 등록 : 한편 나는이 일을 다른 방법을 발견했다. 그 객체가 부서 0 관계가 있는지 확인하고 삭제 :

- (void)managedObjectContextDidChange:(NSNotification *)notification { 
    NSSet *updatedObjects = [[notification userInfo] objectForKey:NSUpdatedObjectsKey]; 

for(NSManagedObject *obj in updatedObjects){   
    // walk through updated objects -> check for employees 
    // check if they still contain departments and if not delete them 
    if([obj.entity.name isEqualToString:@"Employee"]){ 
     NSLog(@"Employee changed!"); 
     if([[(Employee*)obj Departments] count]==0){ 
      NSLog(@"No more relations -> Delete Employee"); 
      [managedObjectContext deleteObject:obj]; 
     } 
    } 
}} 

를 너무 잘 작동하지만, 행동의 종류를 관찰하기위한 여러 기관이있는 경우 더 복잡 얻을 수 있습니다.

+4

Cocoa Touch 또는 Snow Leopard를 사용하는 경우이 논리를 부서의'-prepareForDeletion' 메소드에 넣을 수 있습니다. –

+0

나는 이것이 더 좋은 해결책이라고 생각한다. 고마워! – Nick

+0

부서를 말할 때 NSManagedObject 호출 부서를 의미합니까? – Ricardo