2012-08-22 7 views
16

मैं कोरडाटा के साथ iCloud समर्थन को एकीकृत करने में मदद के लिए these निर्देशों का पालन कर रहा हूं और मुझे कुछ त्रुटियां मिल रही हैं।कोरडाटा 'यह एनएसपीर्सिस्टेंटस्टोरकॉर्डिनेटर के पास लगातार स्टोर नहीं हैं। यह एक सेव ऑपरेशन नहीं कर सकता है। '

मैं अपने AppDelegate में यह है:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 

    if (persistentStoreCoordinator != nil) { 
     return persistentStoreCoordinator; 
    } 

    //NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Little_Wedding_Book_Universal.sqlite"]; 
    NSString *storePath = [[NSString stringWithFormat:@"%@", [self applicationDocumentsDirectory]] stringByAppendingPathComponent:@"appname.sqlite"]; 
    NSURL *storeURL = [NSURL fileURLWithPath:storePath]; 

    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 

    NSPersistentStoreCoordinator* psc = persistentStoreCoordinator; 

    if (IOS_VERSION_GREATER_THAN_OR_EQUAL_TO(@"5.0")) 
    { 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
      NSFileManager *fileManager = [NSFileManager defaultManager]; 

      // Migrate datamodel 
      NSDictionary *options = nil; 

      // this needs to match the entitlements and provisioning profile 
      NSURL *cloudURL = [fileManager URLForUbiquityContainerIdentifier:@"J9VXW4WCE8.com.company.appname"]; 
      NSString* coreDataCloudContent = [[cloudURL path] stringByAppendingPathComponent:@"data"]; 
      if ([coreDataCloudContent length] != 0) { 
       // iCloud is available 
       cloudURL = [NSURL fileURLWithPath:coreDataCloudContent]; 

       options = [NSDictionary dictionaryWithObjectsAndKeys: 
          [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
          [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, 
          @"appname.store", NSPersistentStoreUbiquitousContentNameKey, 
          cloudURL, NSPersistentStoreUbiquitousContentURLKey, 
          nil]; 
      } 
      else 
      { 
       // iCloud is not available 
       options = [NSDictionary dictionaryWithObjectsAndKeys: 
          [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
          [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, 
          nil]; 
      } 

      NSError *error = nil; 
      [psc lock]; 
      if (![psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) 
      { 
       NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
       abort(); 
      } 
      [psc unlock]; 

      dispatch_async(dispatch_get_main_queue(), ^{ 
       NSLog(@"asynchronously added persistent store!"); 
       [[NSNotificationCenter defaultCenter] postNotificationName:@"RefetchAllDatabaseData" object:self userInfo:nil]; 
      }); 

     }); 

    } 
    else 
    { 
     NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
           [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
           [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, 
           nil]; 

     NSError *error = nil; 
     if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) 
     { 
      NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
      abort(); 
     } 
    } 

    return persistentStoreCoordinator; 
} 

मैं अपने AppDelegate का एक उदाहरण बनाने के एक और दृश्य नियंत्रक में, एक वस्तु बना सकते हैं और फोन [appDelegate saveContext]; यह जहां ऐप्लिकेशन क्रैश है। यह हमेशा पूरी तरह से काम करता है (अब तक, iCloud समर्थन जोड़ना)।

-(void)saveContext 
{ 
    NSError *error; 
    if (managedObjectContext != nil) { 
     if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { 
      // Update to handle the error appropriately. 
      NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
      exit(-1); // Fail 
     } 
    } 
} 

तो यह इस पद्धति पर दुर्घटनाओं, और कंसोल मुझे यह संदेश देता है:

'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation.' 

मैं क्या करना है पता नहीं है, मदद!

संपादित करें: कंसोल लॉग नीचे:

एप्लिकेशन को लॉन्च करने पर, मैंने मिलती है:

2012-08-22 17:39:47.906 appname[24351:707] asynchronously added persistent store! 
2012-08-22 17:39:47.955 appname[24351:707] asynchronously added persistent store! 

बाद जब साथ ऐप्लिकेशन क्रैश:

2012-08-22 17:41:31.657 appname[24351:707] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation.' 
*** First throw call stack: 
(0x3749d88f 0x351a2259 0x36bf0fe7 0x36c59287 0xd648b 0x149e0b 0x373f73fd 0x3118ce07 0x3118cdc3 0x3118cda1 0x3118cb11 0x3118d449 0x3118b92b 0x3118b319 0x31171695 0x31170f3b 0x33bb322b 0x37471523 0x374714c5 0x37470313 0x373f34a5 0x373f336d 0x33bb2439 0x3119fcd5 0xd53dd 0xd5378) 
terminate called throwing an exception(lldb) 
+0

क्या पृष्ठभूमि धागा (जो iCloud सतत स्टोर प्राप्त करता है) पहले से ही संदर्भ को सहेजने से पहले समाप्त हो गया है? –

+0

यह जांचने का सबसे अच्छा तरीका क्या है? –

+0

आपका कोड 'NSLog (@" असीमित रूप से लगातार स्टोर जोड़ा गया है! "); 'जब पृष्ठभूमि धागा समाप्त हो गया है, तो आपको इसे देखना चाहिए। –

उत्तर

22

आप शायद persistentStoreCoordinator विधि बुला रहे हैं दो (या अधिक) विभिन्न धागे से। या तो प्रत्यक्ष या अप्रत्यक्ष रूप से।

जैसा लिखा है कि विधि थ्रेड सुरक्षित नहीं है।

यह आपके पास एक ही समस्या के साथ अन्य विधियां हो सकती हैं। आम तौर पर managedObjectContext मौजूद है और इसी तरह से लिखा गया है।

इस समस्या को हल करने के दो तरीके हैं: यदि छोड़कर बात पर जोर देना/

  • उपयोग @synchronize बनाने के लिए उन तरीकों थ्रेड सुरक्षित
  • कदम उनमें से बाहर और एक init विधि में प्रवर्तन कोड और उन्हें संशोधित इवर से पहले दुकान initiali किया गया है nil

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

इस हल करने के लिए आप निम्न में से कोई एक कार्य करें सुनिश्चित करें: (दुकान जिसका अर्थ

  • आप संदर्भ के लिए किसी भी प्रबंधित वस्तु न जोड़ें जब तक आप जानते हैं कि पहले से ही है यह कम से कम एक प्रबंधित वस्तु लोड किया गया है)
  • यदि आपको बिना किसी जांच के संदर्भ में एक प्रबंधित ऑब्जेक्ट जोड़ने की आवश्यकता है (उदाहरण के लिए, जब आप प्रारंभ में खाली स्टोर बनाते हैं), तो सुनिश्चित करें कि स्टोर पहले ही शुरू हो चुका है (उदाहरण के लिए जब आप इसे करते हैं RefetchAllDatabaseData अधिसूचना प्राप्त करें और आप देखते हैं कि डेटाबेस खाली है)।
+0

मुझे जोश कहने की तरह एक ही समस्या का सामना करना पड़ रहा है लेकिन कृपया मुझे बताएं कि मैं लगातार स्टोरकॉर्डिनेटर में "सिंक्रनाइज़" का उपयोग कैसे कर सकता हूं? कृपया मुझे जवाब दें –

40

मुझे एक ही समस्या थी और मेरा समाधान एप्लिकेशन को हटाना था और डेटाबेस में संशोधन के कारण इसे फिर से स्थापित करना था।

+0

अब आप सोचेंगे कि मुझे ऐसा करना याद होगा।मुझे तुरंत याद दिलाने के लिए धन्यवाद! –

+0

मेरे लिए काम किया .. धन्यवाद – Saranjith

+1

यह केवल तभी काम करता है जब आपने ऐप स्टोर में अपना ऐप लॉन्च नहीं किया हो। अन्यथा यह उन सभी उपयोगकर्ताओं के लिए क्रैशिंग ऐप में हल हो जाएगा जो पिछले संस्करण को डाउनलोड करते हैं और इसे आपके नए संस्करण के साथ अपडेट करते हैं। –

0

पुन: अद्यतन करें। Xcode 4.6.3 और MacOSX 10.9.5:

समस्या मैं xcode व्युत्पन्न डेटा स्थान में उत्पाद से संबंधित अनुप्रयोग निर्देशिका हटाया हल करने के लिए:

rm -rd/उपयोगकर्ता // लाइब्रेरी/डेवलपर/Xcode/DerivedData /। स्पष्ट रूप से ऑब्जेक्ट मॉडल के साथ खेलने के बाद डेटा गड़बड़ हो जाता है।

1

बल्कि समारोह seedPerson के अंदर छोड़ने से वर्ग के शीर्ष करने के लिए लेट MOC ले जाकर हल = DataController()। ManagedObjectContext()

2

मैं सिम्युलेटर से एप्लिकेशन को निकाल कर इसे हल और इसे फिर से चलाते हैं। मुझे लगता है कि ऐसा होता है क्योंकि ऐप के पिछले संस्करण में इसमें मूल डेटा नहीं है।

0

मैंने परीक्षण के दौरान यह त्रुटि देखी जब मैंने कुछ अस्थायी NSManagedObjectContext एस को कहीं भी लटकने के बिना स्पिन किया - संदर्भ एआरसी द्वारा यादृच्छिक रूप से मेरे नीचे से हटा दिया जाएगा।

परीक्षणों पर एमओसी के संदर्भ को पकड़ने और प्रत्येक परीक्षण के लिए इसे रीसेट करने के लिए क्या घायल हो रहा था।

यह सुनिश्चित नहीं है कि यह गैर-परीक्षण परिस्थितियों के लिए कितना प्रासंगिक है, लेकिन विशेष रूप से यदि आप बच्चे/भाई के संदर्भों का उपयोग कर रहे हैं, तो यह सुनिश्चित करने योग्य है कि वे वास्तव में अभी भी वहां हैं। : पी

0

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

0

मुझे एक ही समस्या थी। कारण मुझे त्रुटि मिल रही थी क्योंकि मैंने अपने कोरडाटा एंटिटी स्कीमा (मूल रूप से मैंने 2-3 नए गुण जोड़े) में कुछ मामूली परिवर्तन किए थे। और मैं इसके बारे में भूल गया क्योंकि यह तब तक कोई त्रुटि नहीं देता जब तक हम इसे चलाते नहीं। तो क्या होता है, ऐप जो पहले चल रहा था, पहले से ही पिछले स्कीमा के साथ लगातार स्टोर था। तो नई स्कीमा एक ही स्टोर पर इशारा कर रही है। यही कारण है कि हम इसे तब चलाते हैं जब हम इसे चलाते हैं क्योंकि हम नए विशेषताओं तक पहुंचने का प्रयास करते हैं।

समाधान: डिवाइस/सिम्युलेटर से ऐप हटाएं। और इसे पुनर्स्थापित करें। (नए निर्माण में नई स्कीमा होगी और इसलिए क्रैश नहीं होगा।)

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

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