2010-09-09 14 views
6

द्वारा ऑब्जेक्ट्स अपडेट होने पर कोरडाटा एक गलती को पूरा नहीं कर सका, मुझे लगता है कि मैं त्रुटि संदेश समझता हूं: CoreData कोई गलती नहीं कर सका, लेकिन मुझे यकीन नहीं है कि मुझे इससे कैसे निपटना चाहिए।HTTP सेवा

हमारे पास एक ऐसा एप्लिकेशन है जहां हम जेएसओएन सेवा से लौटाए गए डेटा को जारी रखने के लिए कोर डेटा का उपयोग करते हैं। आज मैं निम्नलिखित कर रहा हूं।

  1. लगातार की दुकान से स्थानीय वस्तु प्राप्त करें और यूआई पर लौटने
  2. सर्वर से पूछें कि वस्तु अद्यतन किया जाता है - जब मैं इस सवाल का जवाब मिलता है, मैं अद्यतन कोर डेटा अपडेट वस्तु
  3. के साथ वस्तु कामयाब
  4. अद्यतन यूआई

समस्या है; भले ही मैं बहु धागे का उपयोग नहीं करता हूं, मुझे कभी-कभी एक त्रुटि मिलती है जब HTTP अनुरोध प्रबंधित ऑब्जेक्ट को हटा देता है जो मेरा यूआई बरकरार रहता है। मैंने ऑब्जेक्ट्स को रिटर्न ऑब्जेक्ट्सएफ़फॉल्ट के साथ लाने की कोशिश की। मैंने सोचा कि मैं तब एक प्रबंधित ऑब्जेक्ट के सभी रिश्तों और गुणों तक पहुंच सकता हूं, भले ही इसे हटा दिया गया हो (जब तक मेरा यूआई इसे बनाए रखे)।

मुझे इस समस्या को कैसे हल करना चाहिए?

मैंने सोचा कि मैं पढ़ने और लिखने के लिए अलग NSManagedObjectContext का उपयोग कर सकता हूं। मैं इस परीक्षण बना दिया है:

MyAuthorMO *authorUpdate = [[MyAuthorMO alloc] init]; // I have made this init insert the object into the updateContext 
authorUpdate.firstname = @"Hans"; 
authorUpdate.lastname = @"Wittenberg"; 
authorUpdate.email = @"[email protected]"; 

NSManagedObjectContext *updateContext = [[MyCoreManager getInstance] managedObjectContext]; 

NSError *error = nil; 
[updateContext save:&error]; 

NSManagedObjectContext *readContext = [[MyCoreManager getInstance] readOnlyContext]; 

NSFetchRequest *fetchRequest = [managedObjectModel fetchRequestFromTemplateWithName:@"authorByEmail" substitutionVariables:[NSDictionary dictionaryWithObject:@"[email protected]" forKey:@"EMAIL"]]; 
[fetchRequest setReturnsObjectsAsFaults:NO]; 

NSArray *authors = [readContext executeFetchRequest:fetchRequest error:&error]; 

MyAuthorMO * readAuthor = [authors objectAtIndex:0]; 

// Delete the author with update context: 
[updateContext deleteObject:authorUpdate]; 
[updateContext save:&error]; 

NSLog(@"Author: %@ %@, (%@)", readAuthor.firstname, readAuthor.lastname, readAuthor.email); 

लॉग ठीक रूप में लंबे समय के रूप में मैं लाने के लिए readContext का उपयोग outputted है। अगर मैं fetch के लिए UpdateContext का उपयोग करता हूं, तो मुझे अपवाद मिलता है। यह आशाजनक लग रहा है, लेकिन मुझे डर है कि मैं बाद के चरणों में समस्याओं में भाग जाऊंगा। जल्द या बाद में मैं शायद ऐसी संपत्ति तक पहुंचने का प्रयास करूंगा जो पूरी तरह से नहीं लाया जाता है (एक गलती)। मैं जिस व्यवहार को ढूंढ रहा हूं उसे मैं कैसे प्राप्त कर सकता हूं?

+0

निक, आप शायद सही हैं। मैंने अपनी पिछली पोस्टों के माध्यम से पढ़ा है और सर्वोत्तम समाधान स्वीकार किए हैं। आपके कमेंट के लिए धन्यवाद। – Andi

उत्तर

14

आपको प्रबंधित ऑब्जेक्ट्स को बनाए रखना नहीं चाहिए जिसे संदर्भ जारी किया गया है। संदर्भ को आपके लिए ऐसा करने दें।

समस्या यह है कि प्रबंधित वस्तुएं या तो दोष या वास्तविक वस्तुओं के रूप में मौजूद हो सकती हैं। जब आप एक को बनाए रखते हैं, तो आप उस गलती को बरकरार रख सकते हैं जिसमें कोई डेटा नहीं है। यहां तक ​​कि यदि आप वास्तविक वस्तु को बरकरार रखते हैं, तो ऑब्जेक्ट इसके संदर्भ से अलग होने के बाद ठीक से व्यवहार नहीं कर सकता है।

अपने परिदृश्य को संभालने के लिए, आपको यूआई के लिए संदर्भ और फिर सर्वर के लिए एक संदर्भ की आवश्यकता है। किसी भी संदर्भ में परिवर्तन करने के बाद, आपको यह सुनिश्चित करने के लिए संदर्भ को मर्ज करना चाहिए कि स्टोर के सापेक्ष दोनों उचित रूप से अपडेट किए गए हों।

आपका यूआई डेटा मॉडल की स्थिति को प्रतिबिंबित करने के लिए कॉन्फ़िगर किया जाना चाहिए, आपके पास यूआई की स्थिति पर निर्भर डेटा मॉडल के कुछ हिस्से नहीं होने चाहिए।

+1

मैं आपसे सहमत हूं, लेकिन कुछ अनुवर्ती प्रश्न हैं। मैं एमओ को बरकरार नहीं रख रहा हूं, लेकिन अगर मैं इसे कहीं भी इस्तेमाल करता हूं, तो शायद मुझे यह जानने के बिना बनाए रखा जा सकता है। क्या एमओ को एनएसएआरएआरई या एनएस डिक्शनरी में जोड़ना ठीक है? यदि ऐसा है, तो इसे बनाए रखा जाएगा ... क्या मुझे संदर्भ को मर्ज करने की ज़रूरत है, या क्या मैं अगली बार "पढ़ने" -context "से प्राप्त करने का इंतजार कर सकता हूं? मुझे डर है कि मेरा डेटा भ्रष्ट हो जाता है अगर मैं दो संदर्भों को मर्ज करें जहां वर्तमान में जो ऑब्जेक्ट मैं प्रस्तुत कर रहा हूं उसे हटा दिया गया है ("लिखें" -context के साथ) – Andi

+1

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

0

मुझे अपने डेटाबेस में एक ही समस्या थी क्योंकि मैं उस वस्तु का संदर्भ देता हूं जो मौजूद नहीं था (क्योंकि मैं इसे अन्य संबंधित ऑब्जेक्ट से हटा देता हूं)। मेरा समाधान मेरे रिश्ते में "नो एक्शन" सेट करना था।

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