سؤال

ويقول لديك الإدارات والموظفين وكل قسم له العديد من الموظفين، ولكن كل موظف ويمكن أيضا أن تكون جزءا من عدة إدارات.

وحتى لا يكون هناك علاقة عديدة لكثير بين الموظفين والإدارات. عند حذف قسم أود أن حذف جميع الموظفين التي هي جزء فقط من هذا القسم وإلغاء العلاقة إلى هذا القسم لجميع العاملين والتي هي أيضا عضوا في قسم آخر.

هل شلال القاعدة في كلا الاتجاهين تفعل ذلك؟ أو لا قاعدة تتالي حذف تلقائيا جميع العاملين في قسم بغض النظر عن الانتماءات الأخرى؟

هل كانت مفيدة؟

المحلول

وهناك قاعدة شلال سيتم حذف الكائنات في الوجهة تلقائيا. لذلك، إذا قمت بحذف قسم سيتم حذف الموظفين بغض النظر عن عدد من الإدارات انهم في.

وهذا يبدو وكأنه سلوك تريده هو قليلا أكثر دقة، لحذف فقط "المعزول" الموظفين - أي تلك التي ليس لديها قسم. عند حذف قسم، فإن وسيلة جيدة لإيجاد تلك يكون أن تفعل شيئا من هذا القبيل:

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];
        }
    }
}}

وهذا يعمل بشكل جيد جدا، ولكن قد تحصل على أكثر تعقيدا إذا كان لديك العديد من الكيانات المختلفة التي لمراقبة هذا النوع من السلوك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top