2010-02-04 6 views
20

Mam dwie klasy A i B ze stosunkiem wielu do jednego od A do B (wiele obiektów A może odwoływać się do tego samego B). Pytanie brzmi, czy regułą usuwania na stronie A jest Kaskada, będzie b zostać usunięty tylko wtedy, gdy ostatni odwoływania się zostanie usunięty lub zostanie usunięty czas pierwszy skojarzony A jest usunięty. Reguła usuwania dla strony B relacji jest unieważniana, jeśli to ma znaczenie.Podstawowe dane telefonu iPhone: usuwanie kaskadowe z wielu relacji jeden do jednego

Również przeczytałem w docs DANE PODSTAWOWE że opcjonalne sprawy flag w niektórych przypadkach. Ale nie było jasne, w jaki sposób relacje, które oni ilustrują, odnoszą się do mojej sprawy. Mówili o przypadku zamknięcia (B jest własnością A), podczas gdy moim przypadkiem jest subskrypcja/powiązanie (B jest związane z A).

Mogę po prostu zarządzać programowym kasowaniem kodu, ale chcę umożliwić Core Data robienie właściwych rzeczy, jeśli to możliwe. Ale nie jest jasne, że semantyka kolekcji śmieci, której szukam, jest obsługiwana w Core Data.

Wszelkie sugestie?

Odpowiedz

14

miałem ten sam cel, jak najwyraźniej miał (usuwanie B najszybciej jak ostatnia odwołuje zostanie usunięty). Zajęło mi to więcej czasu, niż się spodziewałem. Szczególnie dlatego

  • W momencie przygotowuje do usunięcia, relacja do wielu w B może nie być jeszcze aktualizowane, więc nie można po prostu liczyć odwołuje się B.
  • isDeleted na wydaje się być już ustawione podczas -prepareForDeletion

oto co pracował dla mnie, jeśli ktoś jest zainteresowany (użyję Departament < - >>Pracownik ponieważ jest to łatwiejsze do odczytania):

W Pracownik:

- (void)prepareForDeletion { 
    // Delete our department if we we're the last employee associated with it. 
    Department *department = self.department; 
    if (department && (department.isDeleted == NO)) { 
     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"isDeleted == NO"]; 
     NSSet *employees = [department.employees filteredSetUsingPredicate:predicate]; 

     if ([employees count] == 0) {   
      [self.managedObjectContext deleteObject:department]; 
     } 
    } 
} 

Inne osoby zasugerowały umieszczenie tej logiki w -willSave w Departamencie. Preferuję powyższe rozwiązanie, ponieważ w niektórych przypadkach mogę chcieć zapisać pusty dział (np. Podczas ręcznej migracji sklepu lub importu danych).

+0

tylko sugestia ... Od docs nie mów, że to nie jest konieczne, aby wiadomość Super, to chyba dobry pomysł, aby zrobić więc: [super prepareForDeletion] –

0

Oto Swift 4 wersja odpowiedzi Lukasa:

public override func prepareForDeletion() { 
    guard let department = department else { return } 

    if department.employees.filter({ !$0.isDeleted }).isEmpty { 
     managedObjectContext?.delete(department) 
    } 
}