2013-07-12 18 views
7

मेरे आवेदन में, मेरे पास डेटाबेस से सभी डेटा साफ़ करने की क्षमता है। एक बार यह ऑपरेशन पूरा होने के बाद, एक बंडल JSON तब पार्स किया जाता है और फिर डेटाबेस में सहेजा जाता है (डेटाबेस को डिफ़ॉल्ट स्थिति में वापस करने के लिए)। इस जेएसओएन को पार्स और सेव करने के लिए ऑपरेशन किसी भी मामले में ठीक काम करता है, जो लगातार स्टोर को समाशोधन और पुनर्निर्माण के अलावा छोड़ देता है, इस मामले में मुझे 'एनएसआईएनवालिड एर्ग्यूमेंट एक्सेप्शन' मिलता है, कारण: 'ऑब्जेक्ट की लगातार स्टोर इस एनएसएमएनेज ऑब्जेक्ट कॉन्टेक्स्ट के समन्वयक से पहुंच योग्य नहीं है'। पृष्ठभूमि संदर्भ में सहेजने के बाद मेरे मुख्य थ्रेड संदर्भ पर mergeChangesFromContextDidSaveNotification को कॉल करने का प्रयास करते समय यह अपवाद फेंक दिया जाता है।पर्सिस्टेंट स्टोर को पुनर्निर्मित करने के बाद कोर डेटा त्रुटि

स्टोर को पुनर्निर्मित करना मुख्य धागे पर किया जाता है, जहां पृष्ठभूमि धागे पर हमेशा पार्सिंग और बचत होती है। यहाँ मेरी प्रबंधित वस्तु संदर्भ सुनिश्चित करने के लिए धागे की निश्चिंतता के लिए गेटर है:

- (NSManagedObjectContext *)managedObjectContext { 

    NSMutableDictionary *threadDictionary = [[NSThread currentThread] threadDictionary]; 
    NSManagedObjectContext *threadContext = threadDictionary[ckCoreDataThreadKey]; 

    if (!threadContext) { 
     threadContext = [self newManagedObjectContext]; 
     threadDictionary[ckCoreDataThreadKey] = threadContext; 
    } 

    return threadContext; 
} 

newManagedObjectContext विधि सभी नए उदाहरणों में एक ही NSPersistentStoreCoordinator वस्तु देता है।

यहाँ दुकान खाली करने के लिए इस्तेमाल किया कोड है (हमेशा मुख्य थ्रेड पर प्रदर्शन किया):

[self.managedObjectContext lock]; 
[self.managedObjectContext reset]; //to drop pending changes 
             //delete the store from the current managedObjectContext 
if ([[self.managedObjectContext persistentStoreCoordinator] removePersistentStore:[[[self.managedObjectContext persistentStoreCoordinator] persistentStores] lastObject] error:error]) { 
    [[NSFileManager defaultManager] removeItemAtURL:storeURL error:error]; 

    [[self.managedObjectContext persistentStoreCoordinator] addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:error]; //recreates the persistent store 

    [self addSkipBackupAttributeToItemAtURL:storeURL]; 
} 

[self.managedObjectContext unlock]; 

अजीब बात यह है कि यह एक ही कोड अन्य परियोजनाओं में ठीक काम करता है, और कोई अन्य की तुलना में मतभेद हैं है डेटा की सामग्री। कोई भी मदद बहुत ही सराहनीय होगी!

उत्तर

13

"ऑब्जेक्ट के लगातार स्टोर इस NSManagedObjectContext के समन्वयक से पहुंच योग्य नहीं है"

इस संदेश का अर्थ आप किसी प्रबंधित उद्देश्य यह है कि डेटा संग्रह है कि आप बस हटाया से लोड किया गया था का उपयोग करने की कोशिश की। आपने समन्वयक से लगातार स्टोर हटा दिया और स्टोर फ़ाइल हटा दी, लेकिन आपके पास अभी भी उस स्टोर से लोड होने वाले कम से कम एक NSManagedObject है। आप उन वस्तुओं का और अधिक उपयोग नहीं कर सकते हैं, क्योंकि यदि आप करते हैं, तो आपको यह विशिष्ट अपवाद मिलता है। सुनिश्चित करें कि आप किसी भी मौजूदा प्रबंधित ऑब्जेक्ट्स से पहले अपने दूसरे स्निपेट में कोर डेटा स्टैक पर परमाणु पर जा रहे हैं।

यह एक अलग ऐप में क्यों काम करता है, सबसे अधिक संभावना है कि ऐप स्टेल प्रबंधित ऑब्जेक्ट्स पर नहीं हो रहा है।

+0

वास्तव में, आप सही हैं। इस प्रोजेक्ट और मेरे अन्य लोगों में अंतर यह है कि इस ऐप में, रूट व्यू कंट्रोलर एक प्राप्त परिणाम नियंत्रक का प्रबंधन करता है जो स्टोर को हटाए जाने पर ऑब्जेक्ट्स रखता है। स्टोर को साफ़ करने के बाद उस नियंत्रक को हटाना और पुनः लोड करना और अब यह बहुत अच्छा काम करता है। बहुत - बहुत धन्यवाद! –

+0

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

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