न तो मॉडल 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
के लिए मॉडल के रूप में सेट होने से पहले - आप अपने मॉडल को कई मॉडलों में तोड़ने के लिए इस तरह की चाल का उपयोग कर सकते हैं।