विकास के तहत हमारे ऐप में हम अपने डेटा को स्टोर करने के लिए एक स्क्लाइट बैकिंग स्टोर के साथ कोर डेटा का उपयोग कर रहे हैं। हमारे ऐप के लिए ऑब्जेक्ट मॉडल जटिल है। साथ ही, हमारे ऐप द्वारा प्रदत्त डेटा की कुल मात्रा आईओएस (आईफोन/आईपैड/आईपॉड टच) ऐप बंडल में फिट होने के लिए बहुत बड़ी है। इस तथ्य के कारण कि हमारे उपयोगकर्ता आमतौर पर डेटा के सबसेट में रूचि रखते हैं, हमने अपने डेटा को इस तरह से विभाजित किया है कि ऐप जहाजों में डेटा ऑब्जेक्ट्स के सबसेट (यद्यपि, ~ 100 एमबी) के साथ जहाज करता है ऐप बंडल आईट्यून इन-ऐप खरीद के माध्यम से अतिरिक्त सामग्री के लिए भुगतान करने के बाद हमारे उपयोगकर्ताओं के पास हमारे सर्वर से अतिरिक्त डेटा ऑब्जेक्ट्स (आकार ~ 5 एमबी से 100 एमबी) डाउनलोड करने का विकल्प होता है। वृद्धिशील डेटा फ़ाइलें (स्क्लाइट बैकिंग स्टोर्स में मौजूद) उसी xcdatamodel संस्करण का उपयोग उस डेटा के रूप में करती है जो बंडल के साथ जहाज़ करता है; ऑब्जेक्ट मॉडल में शून्य परिवर्तन हैं। वृद्धिशील डेटा फ़ाइलों को हमारे सर्वर से gzipped sqlite फ़ाइलों के रूप में डाउनलोड किया जाता है। हम ऐप के साथ बढ़ती सामग्री को शिपिंग करके हमारे ऐप बंडल को फूट नहीं करना चाहते हैं। साथ ही, हम webservice (जटिल डेटा मॉडल की वजह से) पर प्रश्नों पर भरोसा नहीं करना चाहते हैं। हमने अपने सर्वर से incremental sqlite डेटा के डाउनलोड का परीक्षण किया है। हम डाउनलोड किए गए डेटा स्टोर को ऐप के साझा किए गए लगातारस्टोरकॉर्डिनेटर में जोड़ने में सक्षम हैं। दो आईओएस कोर डेटा निरंतर स्टोर मर्ज करने का एक प्रभावी तरीका क्या है?
{
NSError *error = nil;
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:defaultStoreURL options:options error:&error])
{
NSLog(@"Failed with error: %@", [error localizedDescription]);
abort();
}
// Check for the existence of incrementalStore
// Add incrementalStore
if (incrementalStoreExists) {
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:incrementalStoreURL options:options error:&error])
{
NSLog(@"Add of incrementalStore failed with error: %@", [error localizedDescription]);
abort();
}
}
}
हालांकि, वहाँ यह इस तरह से कर रही है के साथ दो समस्याएं हैं।
- डेटा लाने परिणाम (जैसे, NSFetchResultController के साथ) incrementalStoreURL defaultStoreURL से डेटा के अंत में जोड़ा से डेटा के साथ दिखाई देते हैं।
- कुछ वस्तुओं को डुप्लिकेट किया गया है। हमारे डेटा मॉडल में केवल पढ़ने के लिए कई इकाइयां हैं; जब हम को लगातार लगातार स्टोर कोऑर्डिनेटर में जोड़ते हैं तो ये डुप्लीकेट हो जाते हैं।
आदर्श रूप से, हम कोर डेटा को दो लगातार स्टोर्स से ऑब्जेक्ट ग्राफ को मर्ज करने के लिए चाहते हैं (डेटा डाउनलोड के समय दो स्टोरों के डेटा के बीच कोई साझा संबंध नहीं हैं)। साथ ही, हम डुप्लिकेट ऑब्जेक्ट्स को हटाना चाहते हैं। वेब पर खोज करते हुए, हमने लोगों द्वारा किए गए एक ही काम को करने का प्रयास करने वाले कुछ प्रश्नों को देखा - जैसे कि this answer और this answer। हमने Marcus Zarra's blog on importing large data sets in Core Data पढ़ा है। हालांकि, हमने जो समाधान देखा है, उनमें से कोई भी हमारे लिए काम नहीं करता है। हम वृद्धिशील स्टोर से डेटा को मैन्युअल रूप से डिफ़ॉल्ट स्टोर में पढ़ने और सहेजना नहीं चाहते हैं क्योंकि हमें लगता है कि यह बहुत धीमा होगा और फ़ोन पर त्रुटि प्रवण होगी। क्या मर्ज करने का एक और अधिक प्रभावी तरीका है?
हमने निम्नानुसार मैन्युअल माइग्रेशन को लागू करके समस्या को हल करने का प्रयास किया है। हालांकि, हम सफलतापूर्वक विलय होने में सक्षम नहीं हुए हैं। हम उपरोक्त संदर्भ 1 और 2 द्वारा सुझाए गए समाधान पर वास्तव में स्पष्ट नहीं हैं। मार्कस ज़रारा के ब्लॉग ने आईओएस में हमारे बड़े डेटासेट को आयात करने वाली हमारी परियोजना के शुरू में हमारे कुछ मुद्दों को संबोधित किया।
{
NSError *error = nil;
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
NSMigrationManager *migrator = [[NSMigrationManager alloc] initWithSourceModel:__managedObjectModel destinationModel:__managedObjectModel];
if (![migrator migrateStoreFromURL:stateStoreURL
type:NSSQLiteStoreType
options:options
withMappingModel:nil
toDestinationURL:destinationStoreURL
destinationType:NSSQLiteStoreType
destinationOptions:nil
error:&error])
{
NSLog(@"%@", [error userInfo]);
abort();
}
}
ऐसा लगता है कि इस सवाल का जवाब 1 के लेखक वृद्धिशील की दुकान से अपने डाटा पढ़ने और डिफ़ॉल्ट की दुकान में बचत समाप्त हो गया। शायद, हमने दोनों लेखों द्वारा सुझाए गए समाधान को गलत समझा है 1 & 2. हमारे डेटा का आकार हमें हमारे वृद्धिशील डेटा को डिफ़ॉल्ट स्टोर में मैन्युअल रूप से पढ़ने और पुनः डालने से रोक सकता है। मेरा सवाल यह है कि ऑब्जेक्ट ग्राफ़ को दो लगातार स्टॉरेस (जिसमें एक ही ऑब्जेक्ट मॉडल है) से एक लगातार स्टार्ट में विलय करने का सबसे प्रभावी तरीका क्या है?
स्वचालित माइग्रेशन बहुत अच्छी तरह से काम करता है जब हम ग्राफ को ऑब्जेक्ट करने या रिश्तों को संशोधित करने के लिए नई इकाई विशेषताओं को जोड़ते हैं। क्या समान डेटा को उसी लगातार स्टोर में विलय करने का एक आसान समाधान है जो रोकने और फिर से शुरू करने के लिए पर्याप्त लचीला होगा - क्योंकि स्वचालित माइग्रेशन किया जाता है?
जब मुझे उसकी आवश्यकता होती है तो मार्कस ज़रारा कहां है? मैंने [NSPersistentStore migratePersistentStore: toURL: विकल्प: with टाइप: त्रुटि] विधि का उपयोग करके कुछ प्रगति की है। जहां मुझे होना चाहिए, मुझे बस कुछ और साफ कोड की आवश्यकता है। – Sunny
मैं एक ही चीज़ के साथ कुश्ती कर रहा हूं। क्या आप अब तक जो पोस्ट कर चुके हैं उसे पोस्ट कर सकते हैं? मैं हार गया हूं। – damon
हो गया! मुझे बताना कियह तुम्हारे लिए कैसा साबित हुआ। – Sunny