Swift实践:使用CoreData存储多种数据类的通讯录

2017 年 11 月 11 日 CocoaChina 非典型技术宅



上一篇文章简单的实现了一个通讯录,说是通讯录实际上就只是一个简简单单的Name List。这次我们要往这个通讯录里面加入更多的元素,目的也是为了学习CoreData如何存储更多的数据类型。


完成后的效果:


contact.gif


1. CoreData支持存储数据类型


image.png


咦?这里面有两个好像很少看到的类型:Binary Data、Decimal、Transformable。这些都是神马东西?


1.1 Binary Data


顾名思义,就是二进制数据。对应到OC中就是NSData, Swift里面就是Data数据类型。


我们这次就试试在通讯里面存储一下图片,把图片变成Binary Data进行存储。


1.2 Decimal


Decimal为SQL Server、MySql等数据库的一种数据类型,不属于浮点数类型,可以在定义时划定整数部分以及小数部分的位数。使用精确小数类型不仅能够保证数据计算更为精确,还可以节省储存空间。


Decimal(n,m)表示数值中共有n位数,其中整数n-m位,小数m位。例:decimal(10,6),数值中共有10位数,其中整数占4位,小数占6位。


问题来了,Decimal(2,1):

1, 插入数据“12”会怎样?


  • 会出现数据移除的错误。


2, 插入”1.2345“会怎样?


  • 会自动四舍五入成1.2


3, 插入2,会怎样?


  • 会自动补充成2.0,以确保2位的有效长度和1位的小数。


1.3 Transformable


这个类型就比较搞了,有人说它是万能类型,有人说它只要是对象就都可以。


在官方文档里面,Core Data Release Notes for OS X v10.5 是这么介绍的:


Transformable Attributes

There's a new "transformable" type for NSManagedObject attributes that allows you more easily support attribute types that Core Data doesn't support natively. You access an attribute as a non-standard type, but behind the scenes Core Data uses an instance of NSValueTransformer to convert the attribute to and from an instance of NSData. Core Data then stores the data instance to the persistent store.


If you don’t specify a transformer, transformable attributes to use keyed archiving (NSKeyedUnarchiveFromDataTransformerName).


For more details, see Non-Standard Persistent Attributes.

说到底,这是一个非标准的类型。在中文中,非典型技术宅胖其实觉得翻译成“其他”类型更贴切。哈哈~~就和有关部门一样d=====( ̄▽ ̄*)b厉害。


有一点点小小需要注意的地方就是,数据类型要遵守NSCoding协议。只要遵守了,就可以使用这个厉害的存储类型了。


来来来,举几个栗子。Dictionary、Array、Number等等都可以呀。。。


感情是个万金油类型!!


2. 使用CoreData存储多种数据类的通讯录


我们在这里计划存储的类型有Data、Bool、String、Date、Int64。


image.png


2.1 CoreData的基本读取操作


2. 1.1 获取CoreData已经保存数据的五个步骤


  1. 获取总代理和托管对象总管

  2. 从Entity获取一个fetchRequest

  3. 根据fetchRequest,从managedContext中查询数据

  4. 保存。保存过程中可能会出错,要做一下处理。

  5. 添加到数组中


2.1.2 基本存储


获取总代理和托管对象总管

建立一个Entity

保存内容

保存Entity到托管对象。如果保存失败,进行处理

保存到数组中,更新UI

2.2 多种类型的存储


let imgData = from.value(forKey: "avatar") as? Data

let isRelative = from.value(forKey: "isRelative") as? Bool

let name = from.value(forKey: "name") as? String

let updateTime = from.value(forKey: "updateTime") as? Date

let viewTimes = from.value(forKey: "viewTimes") as? Int64

let mobile = from.value(forKey: "mobile") as? String


来来来,就这样轻松easy的把各种类型的都转换好啦~ 然后就可以存入进去了呐。


3. Codable


咱们通讯录里面通常的做法都会把一个用户的信息全部放在一个Model里面,然后只需要把Model存储到库里面就好了。这个怎么做呢?


在OC时代,当需要将一个对象持久化时,需要把这个对象序列化,往常的做法是实现 NSCoding 协议。


写过的人应该都知道实现 NSCoding 协议的代码写起来很痛苦,特别想哭,尤其是当属性非常多的时候。


于是乎,Swift 4 中引入了 Codable 帮我们解决了这个问题。


struct User: Codable {

    var avatarImg: Data

    var isRelative: Bool

    var name: String

    var updateTime: Date

    var viewTimes: Int64

    var mobile: String     

}


如果我们想把User 对象的实例持久化,只需要让 User 遵守 Codable 协议即可,Language 中不用写别的代码。这样就可以直接把Userencode成JSON啦。


下一篇我们就不能再用Xcode创建自带的CoreData来搞事情了,我们要自己搞一个CoreData Stack来实现管理。


所有的源代码都在这里:

https://github.com/Stanbai/CoreDataDemo.git


转自非典型技术宅


NEW RECOMMEND

新/品/推/荐

¥ 68

 立即抢购>> 


登录查看更多
0

相关内容

干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
161+阅读 · 2020年5月14日
【Google AI】开源NoisyStudent:自监督图像分类
专知会员服务
54+阅读 · 2020年2月18日
《动手学深度学习》(Dive into Deep Learning)PyTorch实现
专知会员服务
119+阅读 · 2019年12月31日
Keras作者François Chollet推荐的开源图像搜索引擎项目Sis
专知会员服务
29+阅读 · 2019年10月17日
TensorFlow 2.0 学习资源汇总
专知会员服务
66+阅读 · 2019年10月9日
机器学习相关资源(框架、库、软件)大列表
专知会员服务
39+阅读 · 2019年10月9日
学习自然语言处理路线图
专知会员服务
137+阅读 · 2019年9月24日
Cayley图数据库的可视化(Visualize)
Python开发者
5+阅读 · 2019年9月9日
Pupy – 全平台远程控制工具
黑白之道
43+阅读 · 2019年4月26日
百闻不如一码!手把手教你用Python搭一个Transformer
大数据文摘
18+阅读 · 2019年4月22日
资源 | 深度学习图像标注工具汇总
AI100
6+阅读 · 2018年6月12日
基于LSTM-CNN组合模型的Twitter情感分析(附代码)
机器学习研究会
50+阅读 · 2018年2月21日
精选Top30!最实用的python开源项目都在这里
乌镇智库
4+阅读 · 2018年1月26日
资源 | 适合AI新手的9款人工智能开源软件
AI100
3+阅读 · 2017年11月13日
Learning Embedding Adaptation for Few-Shot Learning
Arxiv
16+阅读 · 2018年12月10日
Semantics of Data Mining Services in Cloud Computing
Arxiv
4+阅读 · 2018年10月5日
Arxiv
7+阅读 · 2018年9月27日
Arxiv
27+阅读 · 2017年12月6日
Arxiv
3+阅读 · 2017年11月20日
VIP会员
相关VIP内容
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
161+阅读 · 2020年5月14日
【Google AI】开源NoisyStudent:自监督图像分类
专知会员服务
54+阅读 · 2020年2月18日
《动手学深度学习》(Dive into Deep Learning)PyTorch实现
专知会员服务
119+阅读 · 2019年12月31日
Keras作者François Chollet推荐的开源图像搜索引擎项目Sis
专知会员服务
29+阅读 · 2019年10月17日
TensorFlow 2.0 学习资源汇总
专知会员服务
66+阅读 · 2019年10月9日
机器学习相关资源(框架、库、软件)大列表
专知会员服务
39+阅读 · 2019年10月9日
学习自然语言处理路线图
专知会员服务
137+阅读 · 2019年9月24日
相关资讯
Cayley图数据库的可视化(Visualize)
Python开发者
5+阅读 · 2019年9月9日
Pupy – 全平台远程控制工具
黑白之道
43+阅读 · 2019年4月26日
百闻不如一码!手把手教你用Python搭一个Transformer
大数据文摘
18+阅读 · 2019年4月22日
资源 | 深度学习图像标注工具汇总
AI100
6+阅读 · 2018年6月12日
基于LSTM-CNN组合模型的Twitter情感分析(附代码)
机器学习研究会
50+阅读 · 2018年2月21日
精选Top30!最实用的python开源项目都在这里
乌镇智库
4+阅读 · 2018年1月26日
资源 | 适合AI新手的9款人工智能开源软件
AI100
3+阅读 · 2017年11月13日
Top
微信扫码咨询专知VIP会员