繁体   English   中英

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

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

我已经上网了很多。 但没有得到满意的答复。

我的问题是我正在使用带有持久性容器(iOS 10+)的Core数据。我已经发布了具有某些数据模型的应用程序的第一个版本。后来我在旧数据模型实体中添加了新属性,然后在iPhone中的旧数据而不进行任何迁移。但是应用程序不会崩溃,甚至不会记录任何错误。

根据文档,如果对数据模型的任何更改使得与持久性存储不兼容,则必须进行迁移,否则应用程序中断。

这是我的代码,让我知道我想念的任何东西。

初始化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能够自动执行轻量级迁移

从链接:

如果仅对模型进行简单的更改(例如向实体添加新属性),则Core Data可以执行自动数据迁移,称为轻量级迁移

核心数据模型版本控制和数据迁移-Apple文档

核心数据在其自动支持的更改中具有令人惊讶的灵活性,其中包括:

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

暂无
暂无

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

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