prepareForDeletion の仕組みに興味があります。
私はかなり単純なオブジェクトグラフを持っています。と呼ばれる 1つのクラスと と呼ばれるIndividual
1 つのクラス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];
}
}
}