2012-03-14 4 views
13

적어도 코어 데이터에서 관계에 대한 삭제 규칙이 문서에 설명 된 간단한 경우를 넘어서서 어떻게 작용하는지 조금 헷갈 린다.코어 데이터 삭제 룰 - 대다 관계 삭제, 비어있는 경우 삭제

대부분의 경우 여기에서 질문에 대한 답은 대부분 일대 다 관계의 왼쪽에있는 객체가 오른쪽에있는 객체를 "소유"하는 모델을 사용합니다. a PersonPhoneNumber입니다. 사용자를 삭제하면 연관된 모든 숫자가 삭제됩니다. 케이스의 종류에서,이 솔루션은 분명하다

Person  --(cascade)-->> PhoneNumber 
PhoneNumber --(nullify)--> Person 

무엇 내가 관심이있는 것은 반대입니다 : 당신이 그렇게 같은 관계를 설정하는 경우 코어 데이터가 당신을 위해 모든 것을 처리 할 것을 다 관계 곳 "소유권"이 취소되었습니다. 예를 들어 CoreDataBooks 샘플 코드를 확장하여 한 곳에서 고유 한 작성자에 대한 모든 정보를 수집하는 Author 엔티티를 추가 할 수 있습니다. A Book에는 한 명의 저자가 있지만 저자에게는 많은 책이 있지만 ... 우리는 책을 열거하지 않은 저자를 좋아하지 않습니다. 따라서 books 관계가 비어 있지 않은 Author 삭제는 허용되지 않아야하며 특정 Author을 참조하는 마지막 Book을 삭제하면 Author이 삭제되어야합니다.

나는 확실하지 않다 무엇을 ... 수동으로이 작업을 수행하는 몇 가지 방법을 상상할 수

은 다음과 같습니다

  • 코어 데이터와 같이 자동적으로 적어도이 중 일부를 할 수있는 방법을 가지고 관계 삭제 규칙?
  • 이 상황을 처리하는 데 "정식"으로 선호되는 방법이 있습니까?

답변

13

Book 클래스에서 prepareForDeletion을 무시하고 작성자에게 다른 책이 있는지 확인할 수 있습니다. 그렇지 않으면 저자를 삭제할 수 있습니다.

- (void)prepareForDeletion { 
    Author *author = self.author; 
    if (author.books.count == 1) { // only the book itself 
     [self.managedObjectContext deleteObject:author]; 
    } 
} 

편집 : 처음

+2

다른 일이 발생하지 않는 한, 저자의 책을 모두 한꺼번에 삭제하는 경우 실패합니다. 나는 해당 prepareForDeletion에 author.books.count의 값을 인쇄하고 있는데 두 책 모두에 대해 2입니다. 그러면 저자는 결코 삭제되지 않습니다. –

1

Rickstr 책과 저자와 DeleteObject 매크로를 호출하지 않는

확인 : 책 저자의 삭제를 방지하기 위해 당신은 validateForDelete 또는 더 나은을 무시할 수 아래 두 가지 기준을 충족시키는 관계가 필요합니다.

  1. 저자 - >> 도서 관계

    거부 ​​허용되어서는 안 비어있는 저자를 삭제 책

- (거부) : 관계 대상에 최소한 하나의 오브젝트가 있으면 소스 오브젝트를 h 제할 수 없습니다.

    1. 도서 - (캐스케이드) - 당신은 삭제할 수 없습니다

      그 저자를 삭제해야합니다 특정 저자를 참조하는 마지막 책을 삭제> 저자

    저자는 첫 번째 규칙에서 비어 있지 않은 책이 있다면 삭제해서는 안된다는 말을합니다. 게시자가 없으면 작성자가 삭제됩니다.

    이론적으로는 작동해야한다고 생각합니다. 이것이 작동하는지 아닌지 알려주세요.

  • +0

    '저자 - (Deny) - >> Books는 좋지만,'Book - (Cascade) -> Author'는 저자가 처음으로 삭제되자 마자 해당 저자의 책은 삭제됩니다. (어느 쪽이든 아니면 내가 뭔가 잘못하고있는 것입니다.) – rickster

    +0

    그러나 같은 저자는 DENY 관계 오른쪽에 묶여 있습니다. 그래서 이론적으로 그는 다른 책을 가지고 있기 때문에 삭제되지 않을 것입니다. –

    1

    Tim의 솔루션과 마찬가지로 작성자 NSManagedObject 하위 클래스에서 willSave 메서드를 재정의 할 수 있습니다. Tim의 솔루션을 사용하는 경우 삭제되지 않은 책에 설정된 책을 필터링하는 것이 좋습니다. 이 방법으로 동시에 모든 저자의 서적을 삭제하면 작성자는 여전히 삭제됩니다.

    - (void)willSave { 
        if (!self.isDeleted) { 
         NSPredicate *notDeletedPredicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary<NSString *,id> *bindings) { 
          return ![(NSManagedObject *)evaluatedObject isDeleted]; 
         }]; 
         NSSet *filteredBooks = [self.books filteredSetUsingPredicate:notDeletedPredicate]; 
         if (filteredBooks.count == 0) 
          [self.managedObjectContext deleteObject:self]; 
        } 
        [super willSave]; 
    }