如何解决:" NSPersistentStoreCoordinator没有持久性商店"?

时间:2015-10-25 16:32:04

标签: core-data swift2 xcode7

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

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

  

CoreData:错误:非法尝试保存到永远不会的文件   打开。 "此NSPersistentStoreCoordinator没有持久存储   (未知)。它无法执行保存操作。"。没有最后的错误   记录。

已添加NSManagedSubclass。

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

5 个答案:

答案 0 :(得分:17)

我也遵循了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)")
//            }
//        }
    }
}

答案 1 :(得分:2)

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

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

在任何情况下,最可能的原因是该函数中的某些初始化代码失败,您随后会很乐意与没有存储的核心数据堆栈一起使用。

答案 2 :(得分:0)

问题在于这两行:

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

&安培;&安培;

let storeURL = docURL.URLByAppendingPathComponent("DataModel.sqlite")
如果您的CoreData是由Xcode自动创建的,则需要将

DataModel更改为您的应用程序的名称。在AppDelegate.swift

中查找这些行

答案 3 :(得分:0)

如果这是您在将核心数据放入其中后第一次运行应用程序,那么可以通过从模拟器中删除应用程序并再次运行它来实现。

发生在我身上,在我这样做之后就有效了。

答案 4 :(得分:0)

您需要加载持久性存储

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