iPhone Core Data: Cascading delete across a many-to-one relationship

Viewed 7427

I have two classes A and B with a many-to-one relationship from A to B (multiple A objects may reference the same B). The question is, if the delete rule on the A side is Cascade, will B be deleted only when the last referencing A is deleted or will it be deleted the first time an associated A is deleted. The delete rule for the B side of the relationship is Nullify if that matters.

Also, I read in the Core Data docs that the Optional flag matters in some cases. But it wasn't clear how the relationships they were illustrating related to my case. They were talking about a containment case (B is owned by A) whereas my case is one of subscription/association (B is related to A).

I could simply manage deletion programmaticaly in the code but wanted to allow Core Data to do the right thing if possible. But it's not clear that the garbage collection semantics that I'm looking for are supported in Core Data.

Any suggestions?

3 Answers

Here's a Swift 4 version of Lukas' answer:

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

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

Adding to @JanApotheker answer you also will need to save the managedObjectContext and cast filter's argument to AnyObject since it is iterating over an NSSet like so:-

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

    if employees.filter({ !($0 as AnyObject).isDeleted }).isEmpty {
        managedObjectContext?.delete(department)
        do {
            try managedObjectContext?.save()
        } catch {
            
        }
    }
}
Related