当我 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 在自动支持的更改方面出奇地灵活,包括:
- 添加和删除属性
- 重命名内容
- 可选性的变化
- 关系类型的变化
我经常上网。却没有得到满意的答复。
我的问题是我正在使用带有持久容器的核心数据 (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 在自动支持的更改方面出奇地灵活,包括:
- 添加和删除属性
- 重命名内容
- 可选性的变化
- 关系类型的变化