9

क्या अलग-अलग NSManagedObjectModels में परिभाषित इकाइयों के बीच संबंधों को मॉडल करना संभव है यदि इकाइयों को हमेशा एनएसएमएनेज्ड ऑब्जेक्ट मॉडल में उपयोग किया जाता है जो प्रासंगिक मॉडलों को विलय करके बनाया जाता है?विलय मॉडल से NSManagedObjectModel में क्रॉस-मॉडल संबंध?

उदाहरण के लिए, मॉडल 1 संबंध (एक-से-एक) toBar साथ एक इकाई Foo परिभाषित करता है और है कि मॉडल 2 एक रिश्ता (एक-से-एक) toFoo साथ एक इकाई Bar परिभाषित करता है। मैं -[NSManagedObjectModel mergedModelFromModels] का उपयोग कर कोरडाटा स्टैक का निर्माण करूंगा, मॉडल 1 और मॉडल 2 विलय कर रहा हूं। क्या इन संबंधों को डेटा मॉडलर या प्रोग्रामेटिक रूप से परिभाषित करने का कोई तरीका है ताकि वे व्यवहार कर सकें जैसे कि वे मॉडल संबंध थे?

उत्तर

16

न तो मॉडल 1 और न ही मॉडल 2 रन टाइम पर लोड होने योग्य होगा जब तक कि वे अच्छी तरह से गठित न हों - यानी, जब तक toBar और toFoo संबंधों के पास गंतव्य नहीं हैं। इसके अलावा, यदि मॉडल 1 और मॉडल 2 में समान रूप से नामित मॉडल हैं, तो आप उनसे एक मर्ज किए गए मॉडल को बनाने में सक्षम नहीं होंगे; वे coalesced नहीं होगा, वे टक्कर लगी होगी, जो एक त्रुटि है।

हालांकि, आप प्रत्येक मॉडल को लोड करने के लिए मैन्युअल रूप से NSManagedObjectModel एपीआई का उपयोग कर सकते हैं और हाथ से एक नया मॉडल बना सकते हैं जिसमें दोनों से इकाइयां हों। NSEntityDescription और NSPropertyDescription कक्षाएं (और इसके उप-वर्ग) NSCopying प्रोटोकॉल को कार्यान्वित करते हैं, इसलिए ज्यादातर मामलों में आपको प्रत्येक घटक मॉडल से अपने समग्र मॉडल में गुणों की प्रतिलिपि बनाने में सक्षम होना चाहिए।

इसके अलावा, NS*Description वर्गों सब एक userInfo शब्दकोश है कि आप Xcode के डेटा मॉडलिंग उपकरण है, जो आप एक स्टैंड के रूप में एक रिश्ते की गंतव्य टैग की तरह काम करने के लिए उपयोग कर सकते हैं में संपादित कर सकते हैं समर्थन करते हैं। उदाहरण के लिए, मॉडल 1 में आपके पास Bar इकाई userInfo कुंजी MyRealEntity के साथ हो सकती है और इसके बदले वास्तविक इकाई का उपयोग करने के लिए सिग्नल के रूप में, अपने विलय मॉडल को बनाते समय इसकी जांच करें।

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

इस प्रकार अपने वास्तविक Foo एक name विशेषता है, और अपने असली बार एक kind विशेषता है, तो, अपने स्टैंड में Foo और Bar उन बस स्टैंड में toBar और toFoo रिश्तों की जरूरत नहीं होगी।

यहाँ कुछ प्रदर्शन मैं क्या बात कर रहा हूँ कोड है:

- (NSManagedObjectModel *)mergeModelsReplacingDuplicates:(NSArray *)models { 
    NSManagedObjectModel *mergedModel = [[[NSManagedObjectModel alloc] init] autorelease]; 

    // General strategy: For each model, copy its non-placeholder entities 
    // and add them to the merged model. Placeholder entities are identified 
    // by a MyRealEntity key in their userInfo (which names their real entity, 
    // though their mere existence is sufficient for the merging). 

    NSMutableArray *mergedModelEntities = [NSMutableArray arrayWithCapacity:0]; 

    for (NSManagedObjectModel *model in models) { 
     for (NSEntityDescription *entity in [model entities]) { 
      if ([[entity userInfo] objectForKey:@"MyRealEntity"] == nil) { 
       NSEntityDescription *newEntity = [entity copy]; 
       [mergedModelEntities addObject:newEntity]; 
       [newEntity release]; 
      } else { 
       // Ignore placeholder. 
      } 
     } 
    } 

    [mergedModel setEntities:mergedModelEntities]; 

    return mergedModel; 
} 

यह काम करता है क्योंकि कोर डाटा में NS*Description वस्तुओं की नकल एक रिश्ते के गंतव्य इकाई और उलटा के संबंध में दर-नाम के बजाय दर-मूल्य है (और एक इकाई की उपनिवेशों के साथ-साथ)। इस प्रकार एक मॉडल उत्परिवर्तनीय है - यानी, NSPersistentStoreCoordinator के लिए मॉडल के रूप में सेट होने से पहले - आप अपने मॉडल को कई मॉडलों में तोड़ने के लिए इस तरह की चाल का उपयोग कर सकते हैं।

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