2010-02-04 4 views
20

मेरे पास ए से बी के कई से एक रिश्ते के साथ दो वर्ग ए और बी हैं (एकाधिक ए ऑब्जेक्ट्स एक ही बी का संदर्भ दे सकते हैं)। सवाल यह है कि, यदि ए पक्ष पर डिलीट नियम कैस्केड है, तो बी को केवल तभी हटा दिया जाएगा जब अंतिम संदर्भ ए को हटा दिया गया है या इसे पहले हटा दिया जाएगा, संबंधित ए हटा दिया गया है। रिश्ते के बी पक्ष के लिए डिलीट नियम अगर मायने रखता है तो उसे हटा दें।आईफोन कोर डेटा: कैस्केडिंग एक से-एक रिश्ते में हटाएं

इसके अलावा, मैंने कोर डेटा दस्तावेज़ों में पढ़ा है कि कुछ मामलों में वैकल्पिक ध्वज महत्वपूर्ण है। लेकिन यह स्पष्ट नहीं था कि वे मेरे मामले से संबंधित संबंधों को कैसे दिखा रहे थे। वे एक रोकथाम के मामले के बारे में बात कर रहे थे (बी ए के स्वामित्व में है) जबकि मेरा मामला सब्सक्रिप्शन/एसोसिएशन (बी से संबंधित है) में से एक है।

मैं कोड में हटाना प्रोग्रामेटिकल का प्रबंधन कर सकता था लेकिन यदि संभव हो तो कोर डेटा को सही काम करने की अनुमति देना चाहता था। लेकिन यह स्पष्ट नहीं है कि कचरा संग्रह अर्थशास्त्र जो मैं खोज रहा हूं कोर डेटा में समर्थित हैं।

कोई सुझाव?

उत्तर

14

मैं एक ही लक्ष्य था के रूप में आप जाहिरा तौर पर था (जैसे ही पिछले एक संदर्भित के रूप में हटा दिया गया है बी हटाना)। यह सही पाने के लिए मुझे उम्मीद से अधिक समय लगा। क्योंकि विशेष रूप से

  • समय एक हटाने के लिए तैयार करता है पर, बी में से-अनेक संबंध, अभी तक अपडेट नहीं किया जा सकता है, ताकि आप केवल गिनती नहीं कर सकते हैं एकबी में संदर्भित। >>कर्मचारी क्योंकि इसे पढ़ने के लिए आसान है -
  • isDeleted पर एक पहले से ही -prepareForDeletion

यहाँ दौरान स्थापित किया जाना है क्या मेरे लिए काम किया है, तो किसी को भी रुचि है (मैं विभाग < इस्तेमाल करेंगे लगता है):

में कर्मचारी:

- (void)prepareForDeletion { 
    // Delete our department if we we're the last employee associated with it. 
    Department *department = self.department; 
    if (department && (department.isDeleted == NO)) { 
     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"isDeleted == NO"]; 
     NSSet *employees = [department.employees filteredSetUsingPredicate:predicate]; 

     if ([employees count] == 0) {   
      [self.managedObjectContext deleteObject:department]; 
     } 
    } 
} 

अन्य लोगों ने विभाग में इस तर्क को -willSave में डालने का सुझाव दिया है। मैं उपर्युक्त समाधान पसंद करता हूं क्योंकि मैं वास्तव में कुछ मामलों में खाली विभाग को सहेजना चाहता हूं (उदाहरण के लिए मैन्युअल स्टोर माइग्रेशन या डेटा आयात के दौरान)।

+0

बस एक सुझाव ... है के बाद से डॉक्स कहना नहीं है कि यह संदेश सुपर करने के लिए आवश्यक नहीं है, यह शायद करने के लिए एक अच्छा विचार है तो: [सुपर तैयारफॉरडिलेशन] –

0

यहाँ लुकास 'जवाब के स्विफ्ट 4 संस्करण है:

public override func prepareForDeletion() { 
    guard let department = department else { return } 

    if department.employees.filter({ !$0.isDeleted }).isEmpty { 
     managedObjectContext?.delete(department) 
    } 
} 

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

  • कोई संबंधित समस्या नहीं^_^