©️ OverlookArt
首页 / AppleDevelop / CoreData

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}