簡體   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