为什么写这篇文章
最近因为新项目想用到数据持久化,本来这是很简单的事情,复杂数据一般直接SQLite
就可以解决了。
但是一直以来使用SQLite
确实存在要自己设计数据库,处理逻辑编码,还有调试方面的种种繁琐问题。所以考虑使用iOS的Core Data方案。
上网查了一堆资料后,发现很多代码都已经是陈旧的了。甚至苹果官方文档提供的代码样例都未必是最新的Swift
版本。于是萌生了自己写一篇文章来整理一遍思路的想法。尽可能让新人快速的上手,不但要知道其然,还要知道其设计的所以然,这样用起来才更得心应手。
什么是Core Data
我们写app肯定要用到数据持久化,说白了,就是把数据保存起来,app不删除的话可以继续读写。
iOS提供数据持久化的方案有很多,各自有其特定用途。
作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:834688868,不管你是大牛还是小白都欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!
如果你正在面试,或者正准备跳槽,不妨看看我精心总结的面试资料:https://gitee.com/Mcci7/i-oser 来获取一份详细的大厂面试资料 为你的跳槽加薪多一份保障
比如很多人熟知的UserDefaults
,大部分时候是用来保存简单的应用配置信息;而NSKeyedArchiver
可以把代码中的对象保存为文件,方便后来重新读取。
另外还有个常用的保存方式就是自己创建文件,直接在磁盘文件中进行读写。
而对于稍微复杂的业务数据,比如收藏夹,用户填写的多项表格等,SQLite
就是更合适的方案了。关于数据库的知识,我这里就不赘述了,稍微有点技术基础的童鞋都懂。
Core Data
比SQLite
做了更进一步的封装,SQLite
提供了数据的存储模型,并提供了一系列API,你可以通过API读写数据库,去处理想要处理的数据。但是SQLite
存储的数据和你编写代码中的数据(比如一个类的对象)并没有内置的联系,必须你自己编写代码去一一对应。
而Core Data
却可以解决一个数据在持久化层和代码层的一一对应关系。也就是说,你处理一个对象的数据后,通过保存接口,它可以自动同步到持久化层里,而不需要你去实现额外的代码。
这种 对象→持久化 方案叫 对象→关系映射(英文简称ORM
)。
除了这个最重要的特性,Core Data
还提供了很多有用的特性,比如回滚机制,数据校验等。
数据模型文件 - Data Model
当我们用Core Data
时,我们需要一个用来存放数据模型的地方,数据模型文件就是我们要创建的文件类型。它的后缀是.xcdatamodeld
。只要在项目中选 新建文件→Data Model 即可创建。
默认系统提供的命名为 Model.xcdatamodeld
。下面我依然以 Model.xcdatamodeld
作为举例的文件名。
这个文件就相当于数据库中的“库”。通过编辑这个文件,就可以去添加定义自己想要处理的数据类型。
数据模型中的“表格” - Entity
当在xcode中点击Model.xcdatamodeld
时,会看到苹果提供的编辑视图,其中有个醒目的按钮Add Entity
。
什么是Entity
呢?中文翻译叫“实体”,但是我这里就不打算用各种翻译名词来提高理解难度了。
如果把数据模型文件比作数据库中的“库”,那么Entity
就相当于库里的“表格”。这么理解就简单了。Entity
就是让你定义数据表格类型的名词。
假设我这个数据模型是用来存放图书馆信息的,那么很自然的,我会想建立一个叫Book
的Entity
。
“属性” - Attributes
当建立一个名为Book
的Entity
时,会看到视图中有栏写着Attributes
,我们知道,当我们定义一本书时,自然要定义书名,书的编码等信息。这部分信息叫Attributes
,即书的属性。
Book的Entity
:
属性名 | 类型 |
---|---|
name | String |
isbm | String |
page | Integer32 |
其中,类型部分大部分是大家熟知的元数据类型,可以自行查阅。
同理,也可以再添加一个读者:Reader的Entity
描述。
Reader的Entity
:
属性名 | 类型 |
---|---|
name | String |
idCard | String |
“关系” - Relationship
在我们使用Entity
编辑时,除了看到了Attributes
一栏,还看到下面有Relationships
一栏,这栏是做什么的?
回到例子中来,当定义图书馆信息时,刚书籍和读者的信息,但这两个信息彼此是孤立的,而事实上他们存在着联系。
比如一本书,它被某个读者借走了,这样的数据该怎么存储?
直观的做法是再定义一张表格来处理这类关系。但是Core Data
提供了更有效的办法 - Relationship
。
从Relationship
的思路来思考,当一本书A被某个读者B借走,我们可以理解为这本书A当前的“借阅者”是该读者B,而读者B的“持有书”是A。
从以上描述可以看出,Relationship
所描述的关系是双向的,即A和B互相以某种方式形成了联系,而这个方式是我们来定义的。
在Reader
的Relationship
下点击+
号键。然后在Relationship
栏的名字上填borrow
,表示读者和书的关系是“借阅”,在Destination
栏选择Book