कहें कि मेरे पास एक कस्टम NSManagedObject Department
है और इसमें एक संपत्ति है जो कर्मचारियों के लिए कई रिश्ते का प्रतिनिधित्व करती है i.e. NSSet *employees;
।कोर डेटा रिलेशनशिप के माध्यम से सभी ऑब्जेक्ट्स को कैसे हटाएं?
किसी दिए गए विभाग के लिए, मैं कर्मचारियों में सभी ऑब्जेक्ट्स को हटाना चाहता हूं। ऐसा करने के लिए अनुशंसित/सर्वोत्तम तरीका क्या है?
तो, परिकल्पित, मेरे कोड इस तरह दिखेगा:
Department.h
@interface Department: NSManagedObject {
}
@property (retain) NSString *departmentName;
@property (retain) NSSet *employees;
@end
Department.m
@implementation Department
@dynamic departmentName;
@dynamic employees;
Employee.h
@interface Employee: NSManagedObject {
}
@property (retain) NSString *firstName;
@property (retain) NSString *lastName;
@property (retain) Department *worksIn;
@end
doCoreDataStuff
- (void)doCoreDataStuff:sender {
//add a department, give it a couple employees, then try to remove those employees
NSEntityDescription *deptEntity = [NSEntityDescription entityForName:@"Department"
inManagedObjectContext:self.managedObjectContext];
Department *dept = [Department alloc] initWithEntity:deptEntity
insertIntoManagedObjectContext:self.managedObjectContext];
NSError *error;
dept.departmentName = @"Accounting";
//save more often than normal to see more easily what causes error
if (![self.managedObjectContext save:&error]) NSLog(@"\nError: %@", [error localizedDescription]);
NSEntityDescription *empEntity = [NSEntityDescription entityForName:@"Employee"
inManagedObjectContext:self.managedObjectContext];
emp.firstName = @"Steve";
emp.lastName = @"Smith";
emp.worksIn = dept;
if (![self.managedObjectContext save:&error]) NSLog(@"\nError: %@", [error localizedDescription]);
emp = [[Employee alloc] initWithEntity:empEntity
insertIntoManagedObjectContext:self.managedObjectContext];
emp.firstName = @"Natasha";
emp.lastName = @"Johnson";
emp.worksIn = dept;
if (![self.managedObjectContext save:&error]) NSLog(@"\nError: %@", [error localizedDescription]);
//all good so far! now will try to delete all employees for this department
dept.employees = [NSSet set];
if (![self.managedObjectContext save:&error]) NSLog(@"\nError: %@", [error localizedDescription]); //"Multiple validation errors occurred."
//this also produces the same error
[[dept mutableSetValueForKey:@"employees"] removeAllObjects];
if (![self.managedObjectContext save:&error]) NSLog(@"\nError: %@", [error localizedDescription]); //"Multiple validation errors occurred."
संबंध employees
तो मेरा अनुमान है कि विभाग से कर्मचारियों को हटाने का मतलब है कि मैं "अनाथ" कर्मचारियों अर्थात को कायम रखने में कर्मचारियों कोशिश कर रहा हूँ वैकल्पिक नहीं है एक संबंधित विभाग के बिना मॉडल।
तो, मुझे लगता है कि मेरा मूल प्रश्न इस बात का खुलासा किया जाना चाहिए: माता-पिता के साथ गैर-वैकल्पिक संबंध होने पर "माता-पिता" की सभी "बच्चे" वस्तुओं को निकालने का सबसे अच्छा/अनुशंसित तरीका क्या है?
मुझे संदेह है कि उत्तर "एक समय में कर्मचारी वस्तुओं को लूप और हटाएगा"।
अद्यतन
एक जवाब और एप्पल के प्रलेखन के लिए एक लिंक के अनुसार, मैं नष्ट शासन स्थापित करने के लिए करने के लिए "कास्केड" और फिर department.employees = [NSSet set];
की तरह कोड के कार्य करने में सक्षम होना चाहिए। हालांकि, यह मेरे बहुत ही सरल प्रोजेक्ट में काम नहीं करता है जहां मैंने तदनुसार हटाए गए नियम को सेट किया है।
धन्यवाद
मैं आश्चर्य है कि अगर आपको लगता है कि समस्या का समाधान मिल गया है? मुझे एक ही समस्या है .. आपके उदाहरण से चिपकने के लिए मेरे पास एक सिंक्रनाइज़ेशन प्रक्रिया है जहां मैं सभी कर्मचारियों को हटाने की कोशिश कर रहा हूं और बाद में उन्हें स्क्रैच से बना रहा हूं (मेरा सिंक्रनाइज़ेशन बहुत जटिल नहीं है) .. लेकिन वर्तमान में एकमात्र तरीका मुझे लगता है कि काम करने के लिए दोनों पक्षों के लिए 'कई' संबंध जहाज को हटाना था - पुनरावृत्त कर्मचारियों को [प्रबंधित ऑब्जेक्ट कॉन्टेक्स्ट डिलीट ऑब्जेक्ट: कर्मचारी] को कॉल करना और बाद में [[विभाग mutableSetValueForKey: @ "staff"] removeAllObjects]; जो सिर्फ गलत लगता है, लेकिन काम करता है .. – herbert
मुझे काम करने के लिए उपर्युक्त उदाहरण कभी नहीं मिला। अंत में, मैंने कर्मचारियों के माध्यम से पुन: प्रयास किया और उन्हें हटा दिया, जैसा कि नीचे दी गई प्रतिक्रिया में मैंने अभी जवाब – stifin
के रूप में स्वीकार कर लिया है, आप दस्तावेज़ीकरण को गलत समझते हैं। जब आप विभाग ऑब्जेक्ट को हटाते हैं, तो डिलीट नियम कर्मचारियों के सेट में कर्मचारी ऑब्जेक्ट्स पर लागू होगा। रिश्ते को बदलने से कोई ऑब्जेक्ट नहीं हट जाएगा। – Eric