コアデータ削除ルールと多対多の関係
-
06-07-2019 - |
質問
部門と従業員がいて、各部門に複数の従業員がいるとしますが、各従業員は複数の部門に所属することもできます。
つまり、従業員と部署の間には多対多の関係があります。部門を削除するとき、その部門の一部であるすべての従業員を削除し、別の部門のメンバーでもあるすべての従業員のこの部門との関係を無効にします。
両方向のカスケードルールはそれを行いますか?または、カスケードルールは、他の所属に関係なく、部門のすべての従業員を自動的に削除しますか?
解決
カスケードルールは、宛先のオブジェクトを自動的に削除します。したがって、部門を削除すると、従業員は所属する部門の数に関係なく削除されます。
「孤児」のみを削除するために、あなたが望む行動はもう少し微妙なようです。従業員-つまり、部署を持たない従業員。部門を削除するとき、それらを見つける良い方法は次のようなことです:
NSManagedObject *doomedDepartment = // get the department to be deleted
NSSet *employees = [doomedDepartment valueForKey:@"employees"];
NSSet *orphanedEmployees = [employees filteredSetUsingPredicate:[NSPredicate predicateWithFormat:@"departments.@count == 1"]];
for (NSManagedObject *orphanedEmployee in orphanedEmployees) {
[managedObjectContext deleteObject:orphanedEmployee];
}
[managedObjectContext deleteObject:doomedDepartment];
他のヒント
ありがとう、アレックス。おそらくそうするでしょう。 その間、私はこれを行う別の方法を見つけました:
1。)変更に関する通知に登録する:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(managedObjectContextDidChange:)
name:NSManagedObjectContextObjectsDidChangeNotification
object:managedObjectContext];
2。)変更が発生し、従業員が更新されたとき。そのオブジェクトに部門との関係が0かどうかを確認し、削除します。
- (void)managedObjectContextDidChange:(NSNotification *)notification {
NSSet *updatedObjects = [[notification userInfo] objectForKey:NSUpdatedObjectsKey];
for(NSManagedObject *obj in updatedObjects){
// walk through updated objects -> check for employees
// check if they still contain departments and if not delete them
if([obj.entity.name isEqualToString:@"Employee"]){
NSLog(@"Employee changed!");
if([[(Employee*)obj Departments] count]==0){
NSLog(@"No more relations -> Delete Employee");
[managedObjectContext deleteObject:obj];
}
}
}}
それもうまくいきますが、この種の動作を観察するためにいくつかの異なるエンティティがある場合、より複雑になるかもしれません。
所属していません StackOverflow