iphone - कोर्डाटा-"NSObjectInaccessibleException-CoreData कोई गलती नहीं कर सका"




objective-c core-data (3)

मैं कोर डेटा के लिए नया हूं और अभी भी नट्स और बोल्ट को ढूंढ रहा हूं और यह त्रुटि मुझे घंटों तक परेशान कर रही है और मुझे कोई समाधान नहीं मिल रहा है। कोई भी मदद बहुत ही सराहनीय होगी।

समस्या इस तरह है

मेरे पास दो विचार हैं जो सर्वर से डेटा प्राप्त करते हैं और यूआई अपडेट करते हैं। मैंने इस तरह से प्रवाह स्थापित किया है

देखें 1 -> सर्वर से HTTP रिक भेजें - कॉलबैक प्राप्त करें -> डेटा को कोर्डाटा में सहेजें -> कोर डेटा से पढ़ें और यूआई पर प्रदर्शित करें (कॉलबैक और देखें / कोडेटाटा को व्यू कंट्रोलर में पढ़ना)

view2 -> सर्वर से HTTP रिक भेजें - कॉलबैक प्राप्त करें -> डेटा को कोर्डाटा में सहेजें -> कोर डेटा से पढ़ें और यूआई पर प्रदर्शित करें (कॉलबैक और कोडेटाटा को पढ़ना / देखें कंट्रोलर में होता है)

देखें 2 इस प्रक्रिया को प्रत्येक 3 सेकंड दोहराता है क्योंकि यह एक ऑटो रीफ्रेश स्क्रीन है।

समस्या यह है कि जब भी मैं दृश्य 1 और 2 वास्तविक तेज़ के बीच स्विच करने का प्रयास करता हूं, तो यह उपरोक्त त्रुटि के साथ ऐप को क्रैश करता है। अगर मैं प्रत्येक दृश्य पर कुछ सेकंड प्रतीक्षा करता हूं (सर्वर से डेटा लाने के लिए प्रतीक्षा करें), यह ठीक काम करता है। क्या मैं कुछ गलत कर रहा हूं, मुझे संशोधित करने की क्या ज़रूरत है?

- (void) refreshData {
    [super refreshData];
    [[UserDataFactory sharedSingleton] refreshLoggedInUserDataAndRespondTo:self user:self.user];
}

- (BOOL) refreshDataCallback:(QExtendedHTTPOperation*)responseOperation {
    [self saveToCoreData: responseOperation.responseArray];
    NSMutableArray *tmp = [[NSMutableArray alloc] initWithArray:[self readFromCoreData]];
    [self setData: tmp];
    [tmp release];
    [self.tableView reloadData];
    return YES;
}

- (void) saveToCoreData:(NSArray *) responseArray{
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"CoreView1" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];
    [fetchRequest setReturnsObjectsAsFaults:NO];
    NSError *error;
    NSArray *items = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
    [fetchRequest release];

    for (NSManagedObject *managedObject in items) {
            [self.managedObjectContext deleteObject:managedObject];
    }

    for (int i=0; i<[responseArray count]; i++) {
            CoreView1 *coreView1_ = [NSEntityDescription insertNewObjectForEntityForName:@"CoreView1" inManagedObjectContext:self.managedObjectContext];
            coreView_.id = [[responseArray objectAtIndex:i] id];    
            [self.managedObjectContext insertObject:coreView1_];
    }
    [self saveContext:self.managedObjectContext];
}

- (NSArray *) readFromCoreData{ 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"CoreView1" inManagedObjectContext:self.managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [fetchRequest setEntity:entity];
    [fetchRequest setReturnsObjectsAsFaults:NO];
    NSError *error;
    NSMutableArray *fetchedObjects = [[self.managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];
    [fetchRequest release];
    return [fetchedObjects autorelease];
}

यह नमूना कोड है जिसका मैं उपयोग कर रहा हूं, यहां तक ​​कि व्यू 2 में एक ही कॉलबैक है और उसी प्रवाह का पालन करता है।

संपादित करें 1 इसे पहले उल्लेख करने के लिए भूल गए, मुझे हमेशा saveCoCoreData विधि में त्रुटि मिलती है। साथ ही, ध्यान देने योग्य एक और बात यह है कि यदि मैं ऑब्जेक्ट्स को हटाने के लिए कोड हटा देता हूं तो यह सब ठीक काम करता है (अपडेट किए गए डेटा को सहेजने से पहले मुझे टेबल से सभी मौजूदा डेटा को हटाने की आवश्यकता है)। यकीन नहीं है कि क्या हो रहा है।


आपके पढ़ने के लिए आपके readFromCoreData विधि में fetchedObjects रिलीज। निष्पादित करें FetchRequest वैसे भी autoreleased वस्तुओं पर वापस आ जाएगा। जब वर्तमान रन लूप निष्पादित हो जाता है (जब आप विचारों से कूद रहे होते हैं) तो यह ऑब्जेक्ट को दो बार रिलीज़ करने का प्रयास करता है (माना जाता है कि आपने अपने स्वयं के ऑटोरेलीज पूल का उपयोग नहीं किया है)।

मैं बदलूंगा

return [fetchedObjects autorelease]; 

सेवा मेरे

return fetchedObjects;

आपके डिलीट कोड को हटाने का कारण यह काम करता है क्योंकि आप निरंतर स्टोर में डेटा को अन्य दृश्य को अपडेट किए बिना हटा रहे हैं, जो अभी भी स्मृति में उस डेटा से जुड़े ऑब्जेक्ट इंस्टेंस प्रबंधित कर चुके हैं। याद रखें, जबकि कोर डेटा ऑब्जेक्ट्स से संबंधित है, प्रत्येक ऑब्जेक्ट के पीछे डेटाबेस में एक पंक्ति होनी चाहिए। जब आप उस पंक्ति को हटाते हैं, तो कोर डेटा गुस्सा हो जाता है।

इसलिए, इस समस्या को ठीक करने के लिए, और अभी भी अपना डेटा हटाएं, आपको अपने विचारों को NSManagedObjectContextWillSaveNotification और / या NSManagedObjectContextDidSaveNotification अधिसूचनाओं के लिए सुनना चाहिए और अपने स्टोर में डेटा के सबसे अद्यतित संस्करणों के साथ अपने विचार अपडेट करना चाहिए। इस बिंदु पर आपको अपने विचारों को पकड़ने वाले किसी भी कोर डेटा ऑब्जेक्ट को फेंक देना चाहिए, और उन्हें स्टोर से पुनः लोड करना चाहिए।


मैंने बस इस कोड को मेरे कोड में हल किया। लगता है कि मेरे कैश को किसी तरह से दूषित कर दिया गया था। मैंने क्रिस्टोफर पिकले और कील गिलार्ड के मेरे कैश को हटाने या नाम बदलने का सुझाव दिया, और वॉयला, दुर्घटना हल हो गई। NSFetchedResultsController सूचकांक सीमा से परे





fault