当我 add/Modify 在不使用任何迁移的情况下向数据模型添加新属性时,应用程序不会崩溃 (IOS 10+)

App not crashing when i add/Modify new attribute to the data model without using any Migration (IOS 10+)

我经常上网。却没有得到满意的答复。

我的问题是我正在使用带有持久容器的核心数据 (iOS 10+)。我已经发布了带有一些数据的应用程序的第一个版本 model.later 我已经添加了新属性到旧数据模型实体然后在 iPhone 中的旧数据之上重新运行应用程序而不携带任何 migrations.But 应用程序不会崩溃甚至不会记录任何错误。

根据文档,如果对数据模型的任何更改导致与持久存储不兼容,则必须执行迁移,否则应用程序会破坏仪式。

这是我的代码,让我知道我遗漏的任何东西。

正在初始化 Coredata 堆栈

import Foundation
import CoreData

class DatabaseController{
    // MARK: - Core Data stack

    static var persistentContainer: NSPersistentContainer = {

        let container = NSPersistentContainer(name: "Test")
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
               abort()
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        return container
    }()

    // MARK: - Core Data Saving support

    static func saveContext () {
        let context = DatabaseController.persistentContainer.viewContext
        if context.hasChanges {
            do {
                try context.save()
            } catch {

                let nserror = error as NSError
                fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
            }
        }
    }
}

存储示例数据

let managedObjectContext = DatabaseController.persistentContainer.viewContext
        let employee = NSEntityDescription.insertNewObject(forEntityName: "University", into: managedObjectContext) as! University

        employee.testName = "Check"
        employee.age = "21"
        employee.createdDate = "21-2-2019"

        do{
            try managedObjectContext.save()
        }
        catch let error{
            print(error)
        }

正在检索示例数据

do{
            let universityEmployeeFetch = NSFetchRequest<NSManagedObject>(entityName: "University")
            let fetchedRecords =  try managedObjectContext.fetch(universityEmployeeFetch) as! [University]
            for employee in fetchedRecords{

                if let name = employee.testName,let age = employee.age, let createdDate = employee.createdDate{
                    print(name,age,createdDate)
                }
            }
        }catch let error{
            fatalError()

        }

数据模型看起来像这样,其中标记的是新添加的属性

快速查看您的代码表明 Core Data 能够自动执行 lightweight migration

来自link:

If you just make simple changes to your model (such as adding a new attribute to an entity), Core Data can perform automatic data migration, referred to as lightweight migration.

Core Data Model Versioning and Data Migration - Apple Documentation

Core Data 在自动支持的更改方面出奇地灵活,包括:

  • 添加和删除属性
  • 重命名内容
  • 可选性的变化
  • 关系类型的变化