2011-12-03 13 views
7

सहेज नहीं रहा है मैं अपने डेटा को प्रबंधित करने के लिए UIManagedDocument का उपयोग कर रहा हूं। मैं मॉडल बनाता हूं और इसका उपयोग करता हूं, और सबकुछ काम कर रहा है, लेकिन मेरे बदलाव SQLite स्टोर पर वापस नहीं लिखे जा रहे हैं।UIManagedDocument

UIManagedDocument के लिए प्रलेखन का कहना है कि ऑटोसॉव को डाटाबेस को डेटा को बनाए रखने का ख्याल रखना चाहिए, लेकिन ऐसा प्रतीत नहीं होता है।

NSManagedObjectContext *moc = [doc managedObjectContext]; 
    NSError *error = nil; 
    MyItem *itemToAdd = (MyItems *)[moc existingObjectWithID:(NSManagedObjectID *)itemsID error:&error]; 

यह वह वस्तु प्राप्त करता है जिसे मैं जोड़ना चाहता हूं (और सफल)।

[itemContainer addItemsObject:itemToAdd]; 
    [doc updateChangeCount:UIDocumentChangeDone]; 

यह एक और वस्तु में एक आइटम संग्रह करने के लिए आइटम कहते हैं, और फिर दस्तावेज़ है कि मैं परिवर्तन करने के बाद कर रहा हूँ बताता है।

कोर डेटा स्टोर में लिखे गए परिवर्तन को देखने के लिए जल्द ही कुछ समय की उम्मीद है, लेकिन इंस्ट्रूमेंट्स में देखकर, मुझे लगता है कि यह कभी नहीं होता है।

आइटम संग्रह एक NSOrderedSet है, और इस मद पर टिप्पणी की वजह से:

Exception thrown in NSOrderedSet generated accessors

मैं एक addItemsObject जोड़ दिया है:

- (void)addItemsObject:(MyItem *)value 
{ 
    NSMutableOrderedSet* tempSet = [NSMutableOrderedSet orderedSetWithOrderedSet:self.items]; 
    [tempSet addObject:value]; 
    self.items = tempSet; 
} 

: वस्तु है कि संग्रह रखती है शायद कोर डेटा के साथ कुछ गलत हो रहा है, यह सूचित किया जा रहा है कि आइटम संग्रह बदल गया है, लेकिन मुझे नहीं पता कि कैसे।

+0

उपकरण के साथ, मैं देख सकता हूं कि डेटा कोर डेटा कैश में लिखा जा रहा है। लेकिन यह कोर डेटा सॉफ़्टवेयर में दिखाई नहीं देता है, और यदि मैं ऐप को मारता और पुनरारंभ करता हूं, तो मेरे बदलाव चले गए हैं। – stevex

+3

मुझे मेरी समस्या मिली। बाहर निकलता है मुझे उस वस्तु के साथ एक त्रुटि हुई जो मैं जोड़ने का प्रयास कर रहा था - मुझे एक आवश्यक संपत्ति याद आई - और ओवरराइडिंग हैंडल के बिना कोई संकेत नहीं है कि कोई समस्या है। इसे यहाँ के बारे में ब्लॉग: http://blog.stevex.net/2011/12/uimanageddocument-autosave-troubleshooting/ – stevex

उत्तर

9

मुझे मेरी समस्या मिली। बाहर निकलता है मुझे उस वस्तु के साथ एक त्रुटि हुई जो मैं जोड़ने का प्रयास कर रहा था - मुझे एक आवश्यक संपत्ति याद आई - और ओवरराइडिंग हैंडल के बिना कोई संकेत नहीं है कि कोई समस्या है।

इसके बारे में यहाँ ब्लॉग किए: http://blog.stevex.net/2011/12/uimanageddocument-autosave-troubleshooting/

+1

यह एक भयानक खोज है - तथ्य यह है कि कई मामलों में CoreData वस्तुओं स्मृति में कायम किया जाना है, लेकिन नहीं की अनुमति देगा डिस्क पर सहेजने पर * बेहद * भ्रामक हो सकता है, और आपके द्वारा दिए गए फ़िक्स बहुत अच्छे हैं। – NSTJ

+0

मैंने एक उत्तर दिया जो भावी लिंक विफलता के मामले में आपके लिंक को सारांशित करता है :) – olynoise

1

मेरी विधि में जहाँ मैं सर्वर से डेटा लाने, मैं पहले संस्थाओं बना सकते हैं और उसके बाद मैं तुरंत दस्तावेज़ में परिवर्तन को बचाने के लिए इन दोनों तरीकों फोन:

[self.document updateChangeCount:UIDocumentChangeDone]; 
[self.document savePresentedItemChangesWithCompletionHandler:^(NSError *errorOrNil) { 
      ... 
     }]; 
0

चाबी ले aways/@ stevex के लिंक से सारांश:

UIManagedDocument के -updateChangeCount विधि कॉल या एक परिवर्तन है कि दस्तावेज़ के +०१२३८७२९५७० के साथ पंजीकृत है को गति प्रदान करना सुनिश्चित करें। अन्यथा दस्तावेज़ नहीं सोचता कि इसे कुछ भी सहेजने की जरूरत है।

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

- (id)contentsForType:(NSString *)typeName error:(NSError * _Nullable __autoreleasing *)outError { 

    id retVal = [super contentsForType:typeName error:outError]; 
    NSLog(@"Autosaving document. contentsForType at fileURL %@ error %@", self.fileURL, *outError); 
    return retVal; 
} 


- (void)handleError:(NSError *)error userInteractionPermitted:(BOOL)userInteractionPermitted { 
    [super handleError:error userInteractionPermitted:userInteractionPermitted]; 
    NSLog(@"ManagedDocument handleError: %@ %@", error.localizedDescription, error.userInfo); 
}