2009-10-23 23 views
11

कहें कि आपके पास विभाग और कर्मचारी हैं और प्रत्येक विभाग में कई कर्मचारी हैं, लेकिन प्रत्येक कर्मचारी कई विभागों का हिस्सा भी हो सकता है।कोर डेटा हटाना नियम और कई से अधिक संबंध

तो कर्मचारियों और विभागों के बीच कई सारे संबंध हैं। एक विभाग को हटाने पर मैं उन सभी कर्मचारियों को हटाना चाहता हूं जो केवल उस विभाग का हिस्सा हैं और सभी विभागों के लिए इस विभाग के रिश्ते को खत्म कर दें जो अन्य विभाग के सदस्य भी हैं।

क्या दोनों दिशाओं में एक कैस्केड-नियम ऐसा करेगा? या अन्य संबद्धताओं के बावजूद एक कैस्केड नियम स्वचालित रूप से किसी विभाग के सभी कर्मचारियों को हटा देता है?

उत्तर

21

एक कैस्केड नियम स्वचालित रूप से गंतव्य पर वस्तुओं को हटा देगा। इसलिए, यदि आप एक विभाग को हटाते हैं, तो कर्मचारियों को उनके द्वारा भेजे जाने वाले विभागों की संख्या के बावजूद हटा दिया जाएगा।

ऐसा लगता है कि आप जो व्यवहार चाहते हैं वह थोड़ा और अधिक है, केवल "अनाथ" कर्मचारियों को हटाने के लिए - - यानी जिनके पास विभाग नहीं है। एलेक्स

NSManagedObject *doomedDepartment = // get the department to be deleted 

NSSet *employees = [doomedDepartment valueForKey:@"employees"]; 
NSSet *orphanedEmployees = [employees filteredSetUsingPredicate:[NSPredicate predicateWithFormat:@"[email protected] == 1"]]; 
for (NSManagedObject *orphanedEmployee in orphanedEmployees) { 
    [managedObjectContext deleteObject:orphanedEmployee]; 
}  

[managedObjectContext deleteObject:doomedDepartment]; 
5

धन्यवाद,: जब आप एक विभाग को हटाते हैं, उन को खोजने का एक अच्छा तरीका है इस तरह कुछ करने के लिए किया जाएगा। मैं शायद ऐसा करूँगा। इस बीच में मैं ऐसा करने का एक अलग रास्ता मिल गया था:

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

कि अच्छी तरह से भी काम करता है, लेकिन अगर आप जिसके लिए इस तरह का व्यवहार निरीक्षण करने के लिए कई अलग अलग संस्थाओं है और अधिक जटिल हो सकती है।

+4

यदि आप कोको टच या हिम तेंदुए पर काम कर रहे हैं, तो आप इस तर्क को विभाग की '-prepareForDeletion' विधि में डाल सकते हैं। –

+0

मुझे लगता है कि यह एक बेहतर समाधान है, धन्यवाद! – Nick

+0

जब आप विभाग कहते हैं, तो क्या आपका मतलब एनएसएमएनेज्ड ऑब्जेक्ट कॉल विभाग है? – Ricardo

संबंधित मुद्दे