2018Swift之Core Data 教程(1)

1.什么是Core data?
Core data是用来管理APP中数据模型的框架。主要提供数据持久化的解决方案。Core Data内部已经实现了许多我们常用的数据增删改查的功能,我们只需要拿来使用即可。(不用编写SQL语句)
2.现在有哪些数据持久化?
plist文件,keychain,userdefault,Sql,Core data
3.创建一个数据模型管理对象(建模)
在一个产品中,肯定有不下十来个数据模型,比如用户模型、购物车模型、时间打卡模型等等。
在Core data中我们使用NSManagedObjectModel来管理数据模型。通过它我们可以使用NSEntityDescription来获取表(entity)

4.创建表和设置表中的属性!
一.点击 Add Entity
二.设置新增 Entity的名字并且选中
三.点击attributes下面加号添加属性
四.通过右边inspector来设置选中的属性
建表

设置属性

PS:表明和类名不是一个东西哦
至此,我们就创建好了一个数据模型,但是现在是没有任何文件和数据的,必须要等我们启动APP的时候才会创建这些设置好的模型,为我们使用NSManagedObject管理这些模型打下基础。

如果你想查看coredata的数据关系,可以通过点击Editor style 来查看
image.png

5.初始化 Core data stack
Core Data stack是我们创建的数据模型的集合,
该堆栈由四个主要对象组成:
托管对象上下文(NSManagedObjectContext),
持久存储协调器(NSPersistentStoreCoordinator),
托管对象模型(NSManagedObjectModel),
持久容器(NSPersistentContainer)。

import UIKit
import CoreData
class DataController: NSObject {
    var managedObjectContext: NSManagedObjectContext
    init(completionClosure: @escaping () -> ()) {
        persistentContainer = NSPersistentContainer(name: "DataModel")
        persistentContainer.loadPersistentStores() { (description, error) in
            if let error = error {
                fatalError("Failed to load Core Data stack: \(error)")
            }
            completionClosure()
        }
    }
}

从iOS10之后,使用NSPersistentContainer来处理Core data stack的创建,并提供对NSManagedObjectContext的访问以及许多便利方法。

NSManagedObjectModel
在创建Core data stack的时候,NSManagedObjectModel是第一个加载到内存中的,根据数据表的名字来解析, 在NSManagedObjectModel对象初始化之后,将构造NSPersistentStoreCoordinator对象。

NSPersistentStoreCoordinator
NSPersistentStoreCoordinator位于核心数据堆栈的中间。协调员负责实现在模型内定义的实体的实例。它在模型中创建实体的新实例,并从持久性存储(NSPersistentStore)中检索现有实例。持久性存储可以位于磁盘上或内存中。NSPersistentStoreCoordinator可以处理多个NSPersistentStore。

NSManagedObjectContext

NSManagedObjectContext是我们经常打交道的一个对象,通过它我们来完成一系列增删改查的操作。
image.png

创建管理对象
NSManagedObject实例实现核心数据模型对象所需的基本行为。 NSManagedObject实例需要两个元素:一个实体描述(一个NSEntityDescription实例)和一个托管对象上下文(一个NSManagedObjectContext实例)。

NSEntityDescription类具有一个类方法,该方法接受实体名称的字符串以及NSManagedObject实例将与之关联的NSManagedObjectContext的引用。 该示例将返回对象定义为创建的对象。

创建NSManagedObject子类

默认情况下,Core Data将NSManagedObject实例返回给您的应用程序。 但是,为模型中的每个实体定义NSManagedObject的子类是非常有用的。 特别是,当你创建NSManagedObject的子类时,你可以定义实体可以用于代码完成的属性,并且可以为这些子类添加便利方法。

要创建NSManagedObject的子类,请在Xcode Core Data模型编辑器中选择该实体,然后在Data Model检查器的Entity窗格中的Class字段中输入名称。 然后在Xcode中创建子类。

@ NSManaged标签通知编译器该变量将在运行时解析。在您的数据模型中定义子类并添加到项目后,可以直接在应用程序中引用它,并提高应用程序代码的可读性。

import UIKit
import CoreData
import Foundation
 
class EmployeeMO: NSManagedObject {
    
    @NSManaged var name: String?
    
}

保存NSManagedObject数据
我们创建的NSManagedObject并不能保持数据的持久性,需要context来做处理

do {
    try managedObjectContext.save()
} catch {
    fatalError("Failure to save context: \(error)")
}

保存NSManagedObjectContext的调用接受对NSError变量的引用,并始终返回成功或失败。 如果保存失败,显示错误状态以便更正它是很重要的。 该错误情况的显示可以如将错误输出到控制台那样简单或者像向用户提供错误消息那样复杂。 如果save方法返回成功,则不需要查询错误变量。

获取查询对象

在我们存储了数据之后,我们肯定会去查询数据,我们使用NSFetchRequest发起查询请求,然后在NSManagedObjectContext上调用executeFetchRequest:error:并将请求与指向错误的指针一起传入。

let employeesFetch = NSFetchRequest(entityName: "Employee")
 
do {
    let fetchedEmployees = try moc.executeFetchRequest(employeesFetch) as! [EmployeeMO]
} catch {
    fatalError("Failed to fetch employees: \(error)")
}

executeFetchRequest:error:方法有两种可能的结果。 它要么返回一个带零个或多个对象的NSArray对象,要么返回nil。 如果返回nil,您收到来自核心数据的错误并需要对其进行响应。 如果数组存在,即使NSArray可能为空,您也会收到请求的可能结果。 一个空的NSArray表示没有找到记录。

设置查询条件
使用NSPredicate设置条件。然后交回给fetchRequest,同时NSPredicate还有多种配置,可以更灵活的供我们使用

let firstName = "Trevor"
fetchRequest.predicate = NSPredicate(format: "firstName == %@", firstName)
image.png

推荐阅读更多精彩内容