美文网首页
CoreData - NSManagedObject(2)

CoreData - NSManagedObject(2)

作者: 冰三尺 | 来源:发表于2017-08-05 20:11 被阅读29次

    在上一节中CoreData - 数据的存储与读取(1)中, 实现了数据的存储与读取, 但是在进行数据存储与读取时使用的事KVC的方式, 这种方式很容易由于我们自己拼接key值错误而导致程序出问题. 而且难以排查, 因为这些错误Xcode并不会给我们任何提示. 下面就来解决这个问题.

    首先和上节一样新建一个工程, 并添加一个实体Bowtie. 并添加以下属性

    屏幕快照 2017-08-05 下午4.58.56.png

    CoreData是支持多种类型的, 除了基本的数据类型之外, 还支持Binary Data(二进制数据),假如我们要持久化一张图片, 那我们就需要用到二进制数据类型. 不仅仅是图片, 包括文本文件也可以存贮. 这样就会带来一个问题, 这个大量的二进制数据额写入写出会很影响性能. 幸运的是CoreData 已经帮我们解决了这个问题.

    首先选中photoData,
    在右侧的检车器里面勾选Allows External Storage选项, 先不要管着个是干嘛的, 先记住勾选这个就会让你的数据读写速度很快.


    屏幕快照 2017-08-05 下午5.05.08.png

    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)是一样的, 只是这次属性比较多而已

    相关文章

      网友评论

          本文标题:CoreData - NSManagedObject(2)

          本文链接:https://www.haomeiwen.com/subject/uctwlxtx.html