核心数据轻量级迁移Xcode崩溃

时间:2018-01-20 16:50:12

标签: swift xcode core-data

我正在尝试做一个非常简单的轻量级迁移,包括添加一个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属性只是一个小改动,所以轻量级迁移应该有效,并且shouldInferMappingAutomaticallyshouldMigrateStoreAutomatically都应默认为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)

但现在我(再次)陷入困境。我无法想象为什么应用程序无法打开数据库文件,也不知道如何确定阻止它的内容。

1 个答案:

答案 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不再崩溃,所以似乎问题已经解决了!