如何解决:"NSPersistentStoreCoordinator没有持久存储"?

4th*_*ace 15 core-data xcode7 swift2

我正在完全按照本教程,将CoreData添加到现有应用程序:https://www.youtube.com/watch?v = WcQkBYu86h8

当我到达seedPerson()moc.save()时,应用程序崩溃时出现此错误:

CoreData:错误:非法尝试保存到从未打开过的文件."这个NSPersistentStoreCoordinator没有持久存储(未知).它无法执行保存操作." 没有记录最后的错误.

NSManagedSubclass已添加.

DataController已连线,我可以进入它.直到save()出现问题才会出现问题.知道我可能遗漏了什么导致这个错误吗?

jay*_*ixz 18

我也遵循了YouTube教程并遇到了同样的问题.我刚刚删除了添加持久存储的后台线程块,并且它工作正常.这是我的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)")
//            }
//        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Jod*_*ins 2

不幸的是,该视频使用了苹果网站上的一些代码,并且该代码示例存在缺陷。主要缺陷是它在将持久存储添加到 MOC 之前缓存 MOC。因此,如果存储的创建完全失败,则将使用没有存储的持久存储协调器来初始化托管对象上下文。

您需要使用调试器并逐步执行创建 PSC(DataController.init 方法)的代码,并查看失败发生的原因。如果您以与该示例相同的方式剪切/粘贴,那么您可能在实例化模型时也忘记了更改模型的名称。

无论如何,最可能的原因是该函数中的某些初始化代码失败,并且您随后可以愉快地使用没有存储的核心数据堆栈。