繁体   English   中英

更改项目名称后Xcode 8 Core Data App崩溃

[英]Xcode 8 Core Data App Crash After Change of Project Name

我更改了Xcode 8项目的名称,如本文中所述。 如何完全重命名Xcode项目(即包含文件夹)?

现在,在安装了旧版本的设备上运行新版本的应用程序时,该应用程序崩溃并显示以下错误消息:

[NSKeyedUnarchiver encodeObjectForKey:]:无法为密钥(NS.objects)解码类(OLD_PROJECTNAME.SomeObject)的对象; 该类可以在源代码或未链接的库中定义

因此,似乎旧名称不适合重命名版本的核心数据堆栈。 如何更改此名称以使应用程序可执行?

编辑:这是我AppDelegate.Swift内部的核心数据初始化代码:

// MARK: - Core Data stack

lazy var persistentContainer: NSPersistentContainer = {
    /*
     The persistent container for the application. This implementation
     creates and returns a container, having loaded the store for the
     application to it. This property is optional since there are legitimate
     error conditions that could cause the creation of the store to fail.
    */

    let container = NSPersistentContainer(name: "Data")


    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error as NSError? {
            // Replace this implementation with code to handle the error appropriately.
            // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.

            /*
             Typical reasons for an error here include:
             * The parent directory does not exist, cannot be created, or disallows writing.
             * The persistent store is not accessible, due to permissions or data protection when the device is locked.
             * The device is out of space.
             * The store could not be migrated to the current model version.
             Check the error message to determine what the actual problem was.
             */
            fatalError("Unresolved error \(error), \(error.userInfo)")
        }
    })
    return container
}()

// MARK: - Core Data Saving support

func saveContext () {
    let context = persistentContainer.viewContext
    if context.hasChanges {
        do {
            try context.save()
        } catch {
            // Replace this implementation with code to handle the error appropriately.
            // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
            let nserror = error as NSError
            fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
        }
    }
}

这是一个生产应用程序,用户在更新后不应丢失任何数据。

您在评论中提到您具有一些可变形的属性。 这与您的错误消息一致,因为[NSKeyedUnarchiver decodeObjectForKey:]NSCoding一部分,并且由于Core Data使用具有可转换属性的NSCoding

这不是核心数据问题。 如果对这些属性的值使用NSCoding并将结果写入文件,则会收到相同的错误。 在Swift中,类的全名类似于AppName.ClassName 如果AppName不匹配,则NSCoding无法解码该对象。 您以OLD_PROJECTNAME.SomeObject类的名称保存了对象,但是现在您的类名是NEW_PROJECTNAME.SomeObject NSCoding处理。 您需要帮助。

要解决此问题,您需要告诉归档系统要使用的类。 您可以使用NSKeyedUnarchiver类方法setClass(_:forClassName:)做到这setClass(_:forClassName:) 您可能需要做一些尝试才能正确使用语法,但是您会遇到类似

NSKeyedUnarchiver.setClass(SomeClass.self, forClassName:"OLD_PROJECT_NAME.SomeObject")

在尝试创建使用此类的任何对象之前,必须执行此操作,以免影响创建这些对象的方式。 由于您正在使用Core Data,因此意味着在做任何以任何方式接触Core Data的事情之前。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM