2015-10-25 12 views
13

मैं इस ट्यूटोरियल वास्तव में, जो किसी मौजूदा ऐप के CoreData कहते हैं अनुसरण कर रहा हूं: https://www.youtube.com/watch?v=WcQkBYu86h8कैसे हल करें: "NSPersistentStoreCoordinator में कोई निरंतर स्टोर नहीं है"?

जब मैं seedPerson() moc.save(), इस त्रुटि के साथ ऐप्लिकेशन क्रैश करने के लिए मिल:

CoreData: error: Illegal attempt to save to a file that was never opened. "This NSPersistentStoreCoordinator has no persistent stores (unknown). It cannot perform a save operation.". No last error recorded.

NSManagedSubclass जोड़ा गया है।

डाटाकंट्रोलर वायर्ड हो गया है और मैं इसमें कदम उठा सकता हूं। यह सहेजने तक नहीं है() कि चीजें गलत हो जाती हैं। कोई भी विचार जो मैंने इस त्रुटि के कारण छोड़ा होगा?

+0

हो सकता है कि आपने 'addPersistentStoreWithType: कॉन्फ़िगरेशन: URL: विकल्प: त्रुटि:' पर ​​कॉल छोड़ा हो? इससे पहले कि आप डेटा को सहेज सकें, आपको लगातार स्टोर जोड़ना होगा। –

+0

वह कोड पोस्ट करें जो आपके मूल डेटा स्टैक को बनाता है। –

उत्तर

2

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

आपको डीबगर का उपयोग करने और कोड के माध्यम से कदम उठाने की आवश्यकता है जो पीएससी (DataController.init विधि) बनाता है और देखें कि विफलता क्यों होती है। यदि आप उस उदाहरण में उसी तरह कट/पेस्ट करते हैं, तो हो सकता है कि मॉडल को तुरंत चालू करते समय भी आप अपने मॉडल का नाम बदलना भूल गए।

किसी भी घटना में, सबसे अधिक संभावना यह है कि उस समारोह में कुछ प्रारंभिक कोड विफल हो गया है, और आप बाद में कोर डेटा स्टैक के साथ खुशी से जा रहे हैं जिसमें कोई स्टोर नहीं है।

14

मैंने यूट्यूब ट्यूटोरियल का भी पालन किया और एक ही समस्या थी। मैंने बस पृष्ठभूमि थ्रेड ब्लॉक को हटा दिया जो लगातार स्टोर जोड़ता है और यह काम करता है। यहाँ मेरी DataController:

import UIKit 
import CoreData 

class WellbetDataController: NSObject { 
    var managedObjectContext: NSManagedObjectContext 

    override init() { 
     // This resource is the same name as your xcdatamodeld contained in your project. 
     guard let modelURL = NSBundle.mainBundle().URLForResource("DataModel", withExtension:"momd") else { 
      fatalError("Error loading model from bundle") 
     } 

     // The managed object model for the application. It is a fatal error for the application not to be able to find and load its model. 
     guard let mom = NSManagedObjectModel(contentsOfURL: modelURL) else { 
      fatalError("Error initializing mom from: \(modelURL)") 
     } 

     let psc = NSPersistentStoreCoordinator(managedObjectModel: mom) 
     self.managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType) 
     self.managedObjectContext.persistentStoreCoordinator = psc 

     let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) 
     let docURL = urls[urls.endIndex-1] 
     /* The directory the application uses to store the Core Data store file. 
     This code uses a file named "DataModel.sqlite" in the application's documents directory. 
     */ 
     let storeURL = docURL.URLByAppendingPathComponent("DataModel.sqlite") 
     do { 
      try psc.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil) 
     } catch { 
      fatalError("Error migrating store: \(error)") 
     } 



//  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) { 
//   let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) 
//   let docURL = urls[urls.endIndex-1] 
//   /* The directory the application uses to store the Core Data store file. 
//   This code uses a file named "DataModel.sqlite" in the application's documents directory. 
//   */ 
//   let storeURL = docURL.URLByAppendingPathComponent("DataModel.sqlite") 
//   do { 
//    try psc.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil) 
//   } catch { 
//    fatalError("Error migrating store: \(error)") 
//   } 
//  } 
    } 
} 
+1

धन्यवाद! एक ही मुद्दे में भाग लें - 'dispatch_async' को हटाकर इसे ठीक करें। –

+0

मैं एक पुस्तक से कुछ नमूना कोड का उपयोग कर एक समान समस्या में भाग गया। मैं परीक्षण के उद्देश्य के लिए ऐप की शुरुआत में कुछ प्रारंभिक प्रबंधित ऑब्जेक्ट्स सेट अप करने का प्रयास कर रहा था। इस ऑपरेशन को मुख्य थ्रेड पर वापस ले जाने का अर्थ है NSPersistentStoreCoordinator सेटअप किसी अन्य को NSManagedObjectContext पर डेटा लिखने का प्रयास करने से पहले समाप्त हो गया है। मेरे मामले में, मुझे लगता है कि सेटअप एन्क्रिप्शन ऑपरेशन में सेटअप कार्य पूरा होने से पहले मैं NSManagedObjectContext को लिखने की कोशिश कर रहा था। –

0

समस्या इन दो पंक्तियों पर है:

guard let modelURL = NSBundle.mainBundle().URLForResource("DataModel", withExtension:"momd") else { 

& &

let storeURL = docURL.URLByAppendingPathComponent("DataModel.sqlite") 

DataModel जरूरतों आपके एप्लिकेशन के नाम से परिवर्तित करने की अगर आपके CoreData था एक्सकोड द्वारा स्वचालित रूप से बनाया गया। AppDelegate.swift

में इन पंक्तियों के लिए देखो
0

यह पहली बार है कि आप एप्लिकेशन को चलाने के आप इसे में कोर डेटा डाल के बाद तो शायद यह सिम्युलेटर से एप्लिकेशन को निकाल कर काम करते हैं और इसे फिर से चलाने सकता है।

यह मेरे साथ हुआ और यह करने के बाद यह काम करता है।

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