1

prepareForDeletion の仕組みに興味があります。

私はかなり単純なオブジェクトグラフを持っています。と呼ばれる 1つのクラスと と呼ばれるIndividual1 つのクラスGroup。それらの間の関係は多対多です。

これまでに行ったことは、グループを削除するときに、グループに属する個人が削除されるグループにのみ属しているかどうかを確認し、そうであれば個人も削除することです。

次のようになります。

Group.m

- (void)prepareForDeletion {

    //individual check: if this group was the last associated with that individual, delete the individual
    for (Individual *individual in self.individuals) {

        if ([individual.groups count] == 1) {
            [self.managedObjectContext deleteObject:individual];
        }
    }
}

今、私は基本的に同じアプローチを行うという考えを持っていましたIndividual. つまり、が削除されると、削除されようとしている がグループ内の最後のものIndividualかどうかを確認します。Individualそれが最後のIndividual場合は、グループも削除する必要があります。

個人.m

- (void)prepareForDeletion {

    // Group check: if this individual was the last associated with that group, delete group
    for (Group *group in self.groups) {

        if ([group.individuals count] == 1) {

            [self.managedObjectContext deleteObject:group];
        }
    }
}

したがって、1 つのグループとの関係が 1 つしかない個人を削除するルートを選択するとします。次に、個人とグループの両方を削除する必要があります。

Individual *individualToDelete = ...
[moc deleteObject:individualToDelete];

ここで、Individual.m の prepareForDeletion でグループを削除します (個人が 1 つしかないため)。しかし、Group.m の prepareForDeletion に入り、そこでグループも削除しようとしますか? 一人しかいないから?

これを修正するには、次のように、削除を呼び出した直後に保存を呼び出す必要があります。

- (void)prepareForDeletion {

    // Group check: if this individual was the last associated with that group, delete group
    for (Group *group in self.groups) {

        if ([group.individuals count] == 1) {

            [self.managedObjectContext deleteObject:group];
            [self.managedObjectContext save:nil];
        }
    }
}
4

0 に答える 0