上一篇文章简单的实现了一个通信录,说是通信录实际上就只是一个简简单单的Name List。此次咱们要往这个通信录里面加入更多的元素,目的也是为了学习CoreData如何存储更多的数据类型。git
完成后的效果: github
咦?这里面有两个好像不多看到的类型:Binary Data、Decimal、Transformable。这些都是神马东西?数据库
顾名思义,就是二进制数据。对应到OC中就是NSData, Swift里面就是Data数据类型。数组
咱们此次就试试在通信里面存储一下图片,把图片变成Binary Data进行存储。bash
Decimal为SQL Server、MySql等数据库的一种数据类型,不属于浮点数类型,能够在定义时划定整数部分以及小数部分的位数。使用精确小数类型不只可以保证数据计算更为精确,还能够节省储存空间。app
Decimal(n,m)表示数值中共有n位数,其中整数n-m位,小数m位。例:decimal(10,6),数值中共有10位数,其中整数占4位,小数占6位。学习
问题来了,Decimal(2,1): 1, 插入数据“12”会怎样?fetch
- 会出现数据移除的错误。
2, 插入”1.2345“会怎样?ui
- 会自动四舍五入成1.2
3, 插入2,会怎样?spa
- 会自动补充成2.0,以确保2位的有效长度和1位的小数。
这个类型就比较搞了,有人说它是万能类型,有人说它只要是对象就均可以。
在官方文档里面,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等等均可以呀。。。
感情是个万金油类型!!
咱们在这里计划存储的类型有Data、Bool、String、Date、Int64。
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的把各类类型的都转换好啦~ 而后就能够存入进去了呐。
我们通信录里面一般的作法都会把一个用户的信息所有放在一个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 中不用写别的代码。这样就能够直接把User
encode成JSON啦。
下一篇咱们就不能再用Xcode建立自带的CoreData来搞事情了,咱们要本身搞一个CoreData Stack来实现管理。
全部的源代码都在这里: https://github.com/Stanbai/CoreDataDemo.git