我正在尝试做一个非常简单的轻量级迁移,包括添加一个Entity属性。
在我的AppDelegate中,我有:
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属性,然后将Model Version
当前更改为此新数据模型。我还尝试过将Entity属性添加到现有的数据模型中。
在我遇到运行的两种情况下,Xcode崩溃而没有让我能够读取任何控制台输出,所以我对如何前进感到茫然。 (我已经做过几十次了。)
我读过的所有内容似乎都表明,因为添加Entity属性只是一个小改动,所以轻量级迁移应该有效,并且shouldInferMappingAutomatically
和shouldMigrateStoreAutomatically
都应默认为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
}()
我在if let 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)
但现在我(再次)陷入困境。我无法想象为什么应用程序无法打开数据库文件,也不知道如何确定阻止它的内容。
答案 0 :(得分:1)
我从我的延迟初始化中删除了新代码并将其返回到:
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
}()
我将断点放在同一个地方,这次在控制台中发现了此消息:无法就地迁移存储:验证错误缺少必填目标属性的属性值
这让我想到在实体I的新属性中设置Default Value
并更新,现在Xcode不再崩溃,所以似乎问题已经解决了!