CoreData数据持久化框架
接下来我们再学习一种本地数据持久化的方法,也是目前使用最多的数据持久化方法,即使用CoreData数据持久化框架。
首先我们要创建一个Data Model数据模型文件放置在Model文件夹中,命名为CoreData,如下图所示:
创建数据模型
然后选中CoreData数据模型,点击下面工具栏的Add Entity创建一个实体,命名为Model。并且在Model实体中定义好项目需要的属性,如下图所示:
由于Model实体我们重新定义了,那么要保证Module模块要选择CurrrentProductModule当前产品的模型,Codegen代码基因要选择Manual/None,不然我们在项目中引用模型的时候可能会找不到我们定义的Model实体,如下图所示:
创建持久存储区文件
模型准备完成后,下一步我们需要创建一个持久存储区的文件,用于保存数据到Model中,我们在Model文件夹中创建一个新的Swift文件,命名为Persistence,并键入下面的代码:
import CoreData struct Persistence { // 一个单例供我们的整个应用程序使用 static let shared = Persistence() // 存储核心数据 let container: NSPersistentContainer // 用于加载 Core Data 的初始化程序,可以选择使用内存中的存储区。 init(inMemory: Bool = false) { container = NSPersistentContainer(name: "CoreData") if inMemory { container.persistentStoreDescriptions.first?.url = URL(fileURLWithPath: "/dev/null") } container.loadPersistentStores { description, error in if let error = error { fatalError("Error: (error.localizedDescription)") } } } }
上述代码中,我们首先引用了CoreData数据持久化框架,然后创建了一个结构体PersistenceController并定义一个常量shared用于初始化。如果是项目创建之初勾选了使用CoreData,则系统会默认创建需要的文件,上述的内容就当作固定的模版使用吧。
访问数据库容器
然后声明一个新的变量container指向NSPersistentContainer数据库容器,声明容器后再给容器进行初始化操作。首先检查内存中是否存在数据库CoreData,如果存在则在需要时进行加载,如果加载失败则输出错误信息。
接下来我们需要在项目中访问数据库容器,打开LinkworldApp文件,创建新的变量persistenceController赋值PersistenceController.shared,并使用环境修改器将数据库数据传递给子视图,如下代码所示:
import SwiftUI import CoreData @main struct LinkworldApp: App { let persistenceController = Persistence.shared var body: some Scene { WindowGroup { ContentView() .environment(.managedObjectContext, persistenceController.container.viewContext) } } }