swift2 如何解决:“NSPersistentStoreCoordinator没有持久性存储”?

enyaitl3  于 2022-11-06  发布在  Swift
关注(0)|答案(5)|浏览(211)

我完全按照这个教程来做,它将CoreData添加到现有的应用程序中:https://www.youtube.com/watch?v=WcQkBYu86h8
当我到达seedPerson()moc.save()时,应用程序崩溃并显示以下错误:
核心数据:错误:尝试保存到从未打开过的文件时非法。“此NSPersistentStoreCoordinator没有永久存储(未知)。它无法执行保存操作。"。未记录上一个错误。
已添加NSManagedSubclass。
DataController已经连接好了,我可以进入它。直到保存()出现问题,你知道我可能遗漏了什么导致了这个错误吗?

lymgl2op

lymgl2op1#

我也看了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)")
//            }
//        }
    }
}
hm2xizp9

hm2xizp92#

不幸的是,该视频使用了Apple网站上的一些代码,并且该代码示例存在缺陷。主要缺陷是,它在将持久存储添加到MOC之前缓存了MOC。因此,如果存储创建失败,则将使用没有存储的持久存储协调器初始化托管对象上下文。
您需要使用调试器并逐步执行创建PSC的代码(DataController.init方法),然后查看失败发生的原因。如果您以与该示例相同的方式剪切/粘贴,那么您可能在示例化模型时忘记更改模型的名称。
在任何情况下,最可能的原因是该函数中的某些初始化代码失败了,而您随后可以愉快地沿着没有存储的核心数据堆栈。

5sxhfpxr

5sxhfpxr3#

您需要加载持久性存储

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

v7pvogib4#

问题就在这两行字上:

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

&&

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

如果CoreData是由Xcode自动创建的,则需要将DataModel更改为应用程序的名称。请在AppDelegate.swift中查找这些行

lrl1mhuk

lrl1mhuk5#

如果这是你第一次运行的应用程序后,你把核心数据,那么也许它可以通过删除应用程序从模拟器,并再次运行它。
这是发生在我身上,它的工作后,我这样做。

相关问题