在上一节中CoreData - 数据的存储与读取(1)中, 实现了数据的存储与读取, 但是在进行数据存储与读取时使用的事KVC的方式, 这种方式很容易由于我们自己拼接key值错误而导致程序出问题. 而且难以排查, 因为这些错误Xcode并不会给我们任何提示. 下面就来解决这个问题.
首先和上节一样新建一个工程, 并添加一个实体Bowtie. 并添加以下属性
CoreData是支持多种类型的, 除了基本的数据类型之外, 还支持Binary Data(二进制数据),假如我们要持久化一张图片, 那我们就需要用到二进制数据类型. 不仅仅是图片, 包括文本文件也可以存贮. 这样就会带来一个问题, 这个大量的二进制数据额写入写出会很影响性能. 幸运的是CoreData 已经帮我们解决了这个问题.
首先选中photoData,
在右侧的检车器里面勾选Allows External Storage选项, 先不要管着个是干嘛的, 先记住勾选这个就会让你的数据读写速度很快.
Transformable(自定义的类型)
只要您的类型符合NSCoding协议,就可以使用可转换类型将任何数据类型保存到Core Data(即使是您定义的数据类型)。
UIColor符合NSSecureCoding,NSSecureCoding继承自NSCoding,如果要保存自己的自定义对象,则首先必须实现NSCoding协议。
下面使用Xcode来为我们创建NSManagedObject subclasses.
在创建之前, 需要做点设置
在右侧的面板中可以看到在 Class 这一栏多了 Codegen 这一栏,可以用来决定代码的组织形式:
Manual / None:没有文件会被创建
Class Definition:一个完整定义的文件会被创建
Category / Extension:一个带 core data 属性声明的 extension 会被创建
选择使用Manual / None
首先选中Bow_Ties.xcdatamodeld文件, 然后Editor\Create NSManagedObject Subclass....
然后next/next/create
会创建两个文件Bowtie+CoreDataClass.swift/Bowtie+CoreDataProperties.swift
在Bowtie+CoreDataProperties.swift文件中
import Foundation
import CoreData
extension Bowtie {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Bowtie> {
return NSFetchRequest<Bowtie>(entityName: "Bowtie");
}
@NSManaged public var isFavorite: Bool
@NSManaged public var lastWorn: NSDate?
@NSManaged public var name: String?
//二进制数据
@NSManaged public var photoData: NSData?
@NSManaged public var searchKey: String?
@NSManaged public var timesWorn: Int32
//对像类型
@NSManaged public var tintColor: NSObject?
@NSManaged public var rating: Double
}
注意:与Objective-C中的@dynamic类似,@NSManaged属性通知Swift编译器,即在运行时而不是在编译时提供属性的setting和getter方法。
ok, 这样我们就为实体创建了一个对象的类, 这样去操作会方便很多.
至于存储和读取方法CoreData - 数据的存储与读取(1)是一样的, 只是这次属性比较多而已