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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容