CoreData
创建数据模型
使用Core Data的第一步是创建一个数据模型文件来定义应用程序对象的结构,包括其对象类型、属性和关系。
选择 File>New>文件,然后选择iOS平台选项卡。向下滚动到CoreData部分,选择 DataModel,然后单击下一步。
设置 CoreData stack
flowchart TD
id1[Persistent Container NSPersistentContainer]
id2[Model NSManagedObjectModel]
id3[Context NSManagedObjectContext]
id4[Store Coordinattor NSPersistentStoreCoordinator ]
id5[(Store 存储空间)]
id1 --- id2
id1 --- id3
id1 --- id4
id4 <---从存储中保存和获取数据的实例--- id5
NSManagedObjectModel的实例表示您的应用程序的模型文件,描述您的应用程序的类型、属性和关系。
NSManagedObjectContext上下文的实例跟踪对应用程序类型实例的更改。
NSPersistentStoreCoordinator存储协调员的实例从存储中保存和获取应用程序类型的实例。
NSPersistentContainer 持久性容器的实例同时设置模型、上下文和存储协调员。
创建持久容器
1class AppDelegate: UIResponder, UIApplicationDelegate {
2
3 ···
4 /// CoreData 持久容器
5 private(set) lazy var persistentContainer: NSPersistentContainer = {
6 // name 传数据模型文件名称
7 let container = NSPersistentContainer(name: "DataStore")
8 container.loadPersistentStores { description, error in
9 if let error = error {
10 fatalError("Unable to load persistent stores: \(error)")
11 }
12 }
13 return container
14 }()
15 ···
16}
持久容器创建后 分别在其managedObjectModel、viewContext和persistentStoreCoordinator属性中保存对模型、上下文和存储协调器实例的引用。
将持久容器的引用传递给视图控制器
在应用程序的根视图控制器中,引入 CoreData,并创建一个变量来保存对持久容器的引用。
1import UIKit
2import CoreData
3class ViewController: UIViewController {
4 var container: NSPersistentContainer!
5
6 override func viewDidLoad() {
7 super.viewDidLoad()
8 guard container != nil else {
9 fatalError("This view needs a persistent container.")
10 }
11 // 持久容器可用.
12 }
13}
14
15// iOS13 在 SceneDelegate 将 AppDelegate 的持久容器引用传递到 rootViewController
16class SceneDelegate: UIResponder, UIWindowSceneDelegate {
17 func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
18 guard let _ = (scene as? UIWindowScene) else { return }
19 if let rootVC = window?.rootViewController as? ViewController, let appDelegate = UIApplication.shared.delegate as? AppDelegate {
20 rootVC.container = appDelegate.persistentContainer
21 }
22 }
23}