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