我完全按照本教程,将CoreData添加到现有应用中: https://www.youtube.com/watch?v=WcQkBYu86h8
当我到达seedPerson()moc.save()时,应用程序崩溃并出现此错误:
CoreData:错误:非法尝试保存到永远不会的文件 打开。 "此NSPersistentStoreCoordinator没有持久存储 (未知)。它无法执行保存操作。"。没有最后的错误 记录。
已添加NSManagedSubclass。
DataController已连线,我可以进入它。直到save()出现问题才结束。知道我可能遗漏了什么导致这个错误吗?
答案 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
}