2010-07-30 23 views
5

अद्यतन नहीं करता है मैं अपने ऐप के लिए बैकअप/पुनर्स्थापना प्रणाली विकसित कर रहा हूं जिसमें उपयोगकर्ता कोर डेटा स्टोर (एसक्लाइट फ़ाइल) का बैक-अप संस्करण डाउनलोड कर सकता है और प्रतिस्थापित कर सकता है डाउनलोड की गई फ़ाइल के साथ वर्तमान में उपयोग किया जाने वाला डेटा स्टोर। हालांकि, उपयोगकर्ता द्वारा फ़ाइल डाउनलोड करने और वर्तमान डेटा स्टोर को प्रतिस्थापित करने के बाद, कोई भी डेटा अपडेट नहीं किया गया प्रतीत होता है। लेकिन जब ऐप & फिर से लॉन्च किया जाता है, तो पुनर्स्थापित डेटा उपलब्ध होता है। कोर ऐप स्टोर की फ़ाइल को फिर से लोड करने के लिए मैं अपने ऐप को कैसे मजबूर कर सकता हूं?ऐप चल रहा है, जबकि कोर डेटा sqlite फ़ाइल को प्रतिस्थापित कर रहा है, डेटा

मैं अपने UIViewController जो डेटा पुनर्स्थापित करता है, तो तरह से एप्लिकेशन प्रतिनिधि का उपयोग करने की, कोर डेटा ढेर के पुनर्निर्माण और नेविगेशन ढेर सारे दृश्य नियंत्रकों के पार प्रचार की कोशिश की है:

MyAppDelegate *app = [[UIApplication sharedApplication] delegate]; 
app.managedObjectContext = nil; 
app.persistentStoreCoordinator = nil; 
app.managedObjectModel = nil; 
managedObjectContext = [app managedObjectContext]; 

NSArray *controllers = [self.navigationController viewControllers]; 
UIViewController *c; 
for (int i = 0; i < [controllers count]; i++) { 
    c = [controllers objectAtIndex:i]; 
    [c setManagedObjectContext:managedObjectContext]; 
} 

लेकिन इस काम नहीं कर रहा है, यह केवल निम्न त्रुटि फेंकता है जब मैं जड़ दृश्य नियंत्रक के लिए वापस जाओ: 'The NSManagedObject with ID:0x5d79060 <x-coredata://D8E73D64-C9BA-4CFA-9213-F8BD61749155/MyObject/p2> has been invalidated.'

किसी को भी कैसे डेटा को फिर से लोड और नए डेटा संग्रह फ़ाइल के साथ काम शुरू करने के लिए एप्लिकेशन के लिए मजबूर करने पता है?

उत्तर

1

मैं क्या लगता है कि आप ट्रिपिंग ऊपर है तथ्य यह है भले ही आप अपने सभी प्रबंधित वस्तु संदर्भों, स्टोर समन्वयकों, और nil की तरह सेट कर सकते हैं वह यह है कि, आप अभी भी करने के लिए है पूरी तरह से पुन: उपयोग में हर कामयाब उद्देश्य यह है कि उन वस्तुओं पर आधारित था।

आपकी सबसे अच्छी शर्त यह है कि आप जो कर रहे हैं वह करना है, लेकिन आपके द्वारा उपयोग किए जाने वाले प्रत्येक कोर डेटा ऑब्जेक्ट को नष्ट करने का एक तरीका भी ढूंढें। हो सकता है कि आप रूट पर अपने विभिन्न दृश्य नियंत्रकों को पॉप कर सकें और उस नियंत्रक को स्क्रैच से पुनः लोड कर सकें, ताकि यह आपके नए कोर डेटा स्टैक का उपयोग कर सके? आप उपयोगकर्ता-मित्रता की एक निश्चित मात्रा खो देंगे (क्योंकि उन्हें आपके द्वारा लोड किए गए नए डेटा का उपयोग करके व्यू कंट्रोलर स्टैक का पुनर्निर्माण करना होगा), लेकिन आप सुनिश्चित होंगे कि आपने जो भी चीज की है उसे नष्ट कर दिया है।

+0

आपके उत्तर के लिए धन्यवाद। यह बहुत अच्छा काम करता है। क्या आप जानते हैं कि इस स्थिति में संस्करण को कैसे संभालना है? मैंने SQL संस्करण को पुराने संस्करण के साथ बदलने की कोशिश की है, और यह मुझे "स्रोत स्टोर के लिए मॉडल नहीं ढूंढ सकता" त्रुटि देता है। –

+0

आपको अपनी मॉडल फ़ाइल को स्पष्ट रूप से संस्करणित करने की आवश्यकता है। एक्सकोड में ऐसा करने के लिए टूल हैं - मौजूदा 'xcdatamodel' में मॉडल संस्करण जोड़ने का विकल्प देखें। – Tim

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