Core data 如何解决:;NSPersistentStoreCoordinator没有持久存储“;?

Core data 如何解决:;NSPersistentStoreCoordinator没有持久存储“;?,core-data,swift2,xcode7,Core Data,Swift2,Xcode7,我完全遵循本教程,该教程将CoreData添加到现有应用程序中: 当我访问seedPerson()moc.save()时,应用程序崩溃,出现以下错误: CoreData:错误:非法尝试保存到从未保存过的文件 开的。“此NSPersistentStoreCoordinator没有持久存储 (未知)。它无法执行保存操作。“。没有最后的错误 记录在案 已添加NSManagedSubclass 数据控制器已经接线,我可以进入它。直到save()出现问题。你知道我遗漏了什么导致了这个错误吗?不幸的是,这

我完全遵循本教程,该教程将CoreData添加到现有应用程序中:

当我访问seedPerson()moc.save()时,应用程序崩溃,出现以下错误:

CoreData:错误:非法尝试保存到从未保存过的文件 开的。“此NSPersistentStoreCoordinator没有持久存储 (未知)。它无法执行保存操作。“。没有最后的错误 记录在案

已添加NSManagedSubclass


数据控制器已经接线,我可以进入它。直到save()出现问题。你知道我遗漏了什么导致了这个错误吗?

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

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


在任何情况下,最有可能的原因是该函数中的某些初始化代码失败,随后您将愉快地使用一个没有存储的核心数据堆栈。

我也遵循了YouTube教程,遇到了同样的问题。我刚刚删除了添加持久性存储的后台线程块,它成功了。这是我的
数据控制器

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)")
//            }
//        }
    }
}

问题出在这两条线上:

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

如果您的CoreData是由Xcode自动创建的,
DataModel
需要更改为应用程序的名称。在AppDelegate.swift中查找这些行 如果这是您在将核心数据放入应用程序后第一次运行该应用程序,那么可能可以通过从模拟器中删除应用程序并再次运行它来实现


这件事发生在我身上,我这么做之后它就开始工作了。

您需要加载持久存储

let persistentContainer = NSPersistentContainer(name: "DbName") 
persistentContainer.loadPersistentStores() { [weak self] _, error in      
      self?.persistentContainer.viewContext.automaticallyMergesChangesFromParent = true            
}

也许您遗漏了对
addPersistentStoreWithType:configuration:URL:options:error:
的调用?您必须先添加持久存储,然后才能将数据保存到其中。发布创建核心数据堆栈的代码。谢谢!遇到同样的问题-删除
调度\u async
修复了它。我使用一本书中的一些示例代码遇到了类似的问题。为了进行测试,我试图在应用程序启动时设置一些初始托管对象。将此操作移回主线程意味着NSPersistentStoreCoordinator设置在其他任何操作有机会尝试将数据写入NSManagedObjectContext之前完成。在我的例子中,我想我是在异步操作中的安装工作完成之前尝试写入NSManagedObjectContext。这仅适用于iOS 10+。
let persistentContainer = NSPersistentContainer(name: "DbName") 
persistentContainer.loadPersistentStores() { [weak self] _, error in      
      self?.persistentContainer.viewContext.automaticallyMergesChangesFromParent = true            
}