Swift 核心数据轻量级迁移Xcode崩溃
我正在尝试做一个非常简单的轻量级迁移,包括添加实体属性 在我的AppDelegate中,我有:Swift 核心数据轻量级迁移Xcode崩溃,swift,xcode,core-data,Swift,Xcode,Core Data,我正在尝试做一个非常简单的轻量级迁移,包括添加实体属性 在我的AppDelegate中,我有: lazy var persistentContainer: NSPersistentContainer = { let container = NSPersistentContainer(name: "app") container.loadPersistentStores(completionHandler: { (storeDescription, error)
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "app")
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
return container
}()
我已经尝试创建一个新的.xcdatamodel,并在那里添加Entity属性,然后将模型版本
更改为当前的新数据模型。我还尝试简单地将实体属性添加到现有的数据模型中
在这两种情况下,当我点击run时,Xcode崩溃了,而没有给我读取任何控制台输出的能力,因此我不知道如何前进。(我已经做了几十次了。)
我读到的所有内容似乎都表明,由于添加实体属性只是一个小改动,轻量级迁移应该可以工作,应该自动地进行增量迁移
,而应该自动地进行增量迁移
应该默认为true
关于如何使用addPersistentStore
执行轻量级迁移,有很多解释,但我没有使用;我正在使用loadPersistentStores
,似乎我必须重构我的整个应用程序来改变这一点(而且,无论如何,一切似乎都表明loadPersistentStores
是处理核心数据的新的/经批准的方式)
更新
根据其他一些SO帖子,我已将惰性初始化更新为以下内容:
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "app")
let url = NSPersistentContainer.defaultDirectoryURL()
let description = NSPersistentStoreDescription(url: url)
description.shouldAddStoreAsynchronously = true
description.shouldInferMappingModelAutomatically = true
description.shouldMigrateStoreAutomatically = true
description.isReadOnly = false
container.persistentStoreDescriptions = [description]
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
return container
}()
如果让error=error,我就在处设置了一个断点,并且能够在Xcode崩溃之前捕获控制台。结果如下:
CoreData: warning: View context accessed for persistent container app with no stores loaded
CoreData: warning: View context accessed for persistent container app with no stores loaded
CoreData: error: -addPersistentStoreWithType:SQLite configuration:(null) URL:file:///var/mobile/Containers/Data/Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Library/Application%20Support/ options:{
NSAddStoreAsynchronouslyOption = 1;
NSInferMappingModelAutomaticallyOption = 1;
NSMigratePersistentStoresAutomaticallyOption = 1;
NSReadOnlyPersistentStoreOption = 0;
}
... returned error Error Domain=NSCocoaErrorDomain Code=256 "The file couldn’t be opened." UserInfo={NSSQLiteErrorDomain=14, NSUnderlyingException=unable to open database file} with userInfo dictionary {
NSSQLiteErrorDomain = 14;
NSUnderlyingException = "unable to open database file";
}
(lldb)
但现在我(又)被卡住了。我无法想象为什么应用程序无法打开数据库文件,并且不知道如何确定是什么阻止了它。Update
我从惰性初始化中删除了新代码,并将其简单地返回给:
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "bartender")
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
return container
}()
我将断点放在同一个位置,这一次在控制台中发现了以下消息:Cannot migrate store in place:Validation error缺少强制目标属性上的属性值
这让我想到在我更新的实体的新属性中设置一个默认值
,现在Xcode不再崩溃,所以问题似乎已经解决了