Swift实践:使用CoreData完成上班签到小工具1. CoreData Stack的作用2.创建 CoreData Stack3. 一对多的关系4. 完成Demo,了解使用CoreData St

image.png

之前在前两篇里面实现了一个十分简陋的通讯录,而且都是通过系统默认的方式创建的CoreData。可是实际中哪里有那么好的事情嘛,要是忘记在创建工程的时候勾选了下面这个图怎么办?

image.png

难道我们要把工程删除,再重新创建嘛?很多时候再开始工程的时候并特么的不知道需要用到数据库啊。更多的时候已经都开始敲代码了,连需求文档都还木有拿到手里,PM只会轻轻的说一句:设计图不是已经有了嘛,先画UI吧。

所以,CoreData Stack是为了解决这个问题诞生的嘛?很遗憾,并不是。看了前面的两篇文章之后,有木有觉得CoreData不怎么好用,还挺麻烦的呐?这时候要祭出CoreData Stack的啦。

1. CoreData Stack的作用

其实这个东西在一篇的时候提到过,不信您看:Swift实践:使用CoreData完成一个通讯录存储

一个基本的 Core Data 栈由四个主要部分组成:托管对象 (NSManagedObject),托管对象上下文 (NSManagedObjectContext),持久化存储协调器 (NSPersistentStoreCoordinator),以及持久化存储 (NSPersistentStore)。

CoreDataStack,是自定义的一个CoreData 的栈对象,可以通过它,初始化项目的CoreData,以及获取到Context,对数据库进行增删改查等操作。

2.创建 CoreData Stack

非典型技术宅既然说了这货有四部分组成,那咱们就一个一个来呗。艾玛,因为发现文章会被抄袭,抄袭之后有些人还不署名,搞的只好在文章里面内嵌入一些自己的名字。心酸~~~~

2.1 iOS9

在iOS9中,CoreData Stack的三个核心类是这样的:

-管理对象上下文NSManagedObjectContext

  • 对象模型NSManagedObjectModel
  • 存储调度器NSPersistentStoreCoordinator

这个时候存储是在Documents中间。

2.2 iOS10之后

iOS10之后就有点不一样了, 增加了一个叫做NSPersistentContainer的东西。这个玩意儿作用就是用来管理CoreData Stack,为了能够让大家用起来更爽、更简单。

需要说明的是,NSPersistentContainer 一点都没有向下兼容的意思,完全不兼容iOS9.0,如果非要在iOS9.0里面使用,会直接闪退。

这个时候存储是在Library->Application Support中。

2.3 来吧,开始创建吧

宅胖这么懒,怎么还可能再写一个兼容iOS9.0的呐,想太多了~~~哈哈!所以,俺们只写iOS10.0以后的。写到这个时候,连版本号都已经写烦了。

  • Step1:搞一个NSPersistentContainer出来
  • Step2:创建CoreData Stack
  • Step3:别忘了还有一个NSManagedObjectContext
  • Step4:提供一个保存数据的方法
  • Step5:最后别忘记了在AppDelegate.swift里面应用一下,不然不是白搞了半天嘛
    lazy var storeContainer: NSPersistentContainer = {
       let container = NSPersistentContainer(name: self.modelName)

        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                debugPrint("Unclear error\(error)")
            }
        })
        return container
    }()

    lazy var managedContext: NSManagedObjectContext = {
        return self.storeContainer.viewContext
    }()

    func saveContext() {
        guard managedContext.hasChanges else { return }

        do {
            try managedContext.save()
        } catch let error as NSError {
            debugPrint("Unclear error\(error)")
        }

    }

3. 一对多的关系

CoreData中实体管理关系是有三种的:1V1,1VN,NVN。咱们之前的两个例子都是1V1。但是这个跟生活中不符啊,不能什么事情都是一对一啊,例如一夫一妻制,有的地方还是一妻多夫制呐,还有换妻换夫怎么办?政治不正确啊,非典型技术宅!!注意 例如一个人下了很多订单,订单里面又包含了很多商品。

image.png

如图所示,Relationships表示管理关系的名称,Destination表示目标表的名字,Inverse表示反向关系。

前面两个都比较好理解,Inverse需要稍微多说一点点。如果没有反向关系,就选择No Inverse,但是苹果官方建议为了保证数据之间的一致性,最好设置反向关系。

image.png

4. 完成Demo,了解使用CoreData Stack

然后咱们搞个小型本地化纯良心自觉单机版的打卡器。这个打卡器用来管理员工的每次打卡时间。可以增加、删除打卡时间。

完成后的效果图:

attentances.gif

思维导图如下:

image.png

4. 补充:如果创建工程的时候遗忘了勾选使用CoreData怎么办

如果忘选了也没有关系,创建一个新的Data Model文件:

image.png

设置完数据库之后,按照如下操作:

image.png

好啦,就会自动生成文件啦。

有钱的大爷就点击下方打赏点卖笑钱,有力气的就在github上给个星星✨。给个赞也行。

么么哒~(~o ̄3 ̄)~ 爱你们~ 所有的源代码都在这里: https://github.com/Stanbai/CoreDataDemo.git


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏谈补锅

深入浅出-iOS程序性能优化 (转载)

iOS应用是非常注重用户体验的,不光是要求界面设计合理美观,也要求各种UI的反应灵敏,我相信大家对那种一拖就卡卡卡的 TableView 应用没什么好印象。

832
来自专栏一个会写诗的程序员的博客

《Springboot极简教程》使用Spring Boot, JPA, Mysql, ThymeLeaf,gradle, Kotlin快速构建一个CRUD Web App

使用Spring Boot, JPA, Mysql, ThymeLeaf,gradle, Kotlin快速构建一个CRUD Web App

742
来自专栏前端小吉米

冲顶大会有前端什么事吗?

2785
来自专栏数据科学与人工智能

【Python环境】Scrapy爬虫轻松抓取网站数据

网络爬虫(Web Crawler, Spider)就是一个在网络上乱爬的机器人。当然它通常并不是一个实体的机器人,因为网络本身也是虚拟的东西,所以这个“机器人”...

28110
来自专栏开源优测

python selenium2示例 - Page Object Model

前言 python selenium2是当前主流的web自动化测试框架,提供了多浏览器的支持(chrome、ie、firefox、safari等等),同时支持...

34110
来自专栏Python中文社区

用Python玩转微信的正确姿势!

0. itchat 最近研究了一些微信的玩法,我们可以通过网页版的微信微信网页版,扫码登录后去抓包爬取信息,还可以post去发送信息。 然后发现了itchat这...

4188
来自专栏木宛城主

ASP.NET MVC 随想录—— 使用ASP.NET Identity实现基于声明的授权,高级篇

在这篇文章中,我将继续ASP.NET Identity 之旅,这也是ASP.NET Identity 三部曲的最后一篇。在本文中,将为大家介绍ASP.NET ...

2038
来自专栏QQ音乐技术团队的专栏

QQ 音乐 Android 吃 Pie 之路

Android P 这次有很多行为变更,其中不乏一些需要亟需适配的变更。

41412
来自专栏代码GG之家

google 分屏 横屏模式 按home键界面错乱故障分析(三)

google 进入分屏后在横屏模式按home键界面错乱( 三) 你确定你了解分屏的整个流程? ? 故障解析系列文章列表: google 分屏 横屏模式 按hom...

1906
来自专栏腾讯移动品质中心TMQ的专栏

【测试左移专栏】用 Powermock 和 Mockito 来做安卓单元测试

在计算机编程中,单元测试(Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。

2240

扫码关注云+社区