قواعد حذف البيانات الأساسية والعديد من لكثير العلاقات
-
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.) عندما تحدث التغييرات ويحصل على تجديد موظف. I معرفة ما اذا كان هذا الكائن له 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];
}
}
}}
وهذا يعمل بشكل جيد جدا، ولكن قد تحصل على أكثر تعقيدا إذا كان لديك العديد من الكيانات المختلفة التي لمراقبة هذا النوع من السلوك.