Swift:在 Core Data 中存储自定义类的数组

Posted

技术标签:

【中文标题】Swift:在 Core Data 中存储自定义类的数组【英文标题】:Swift: Store arrays of custom classes in Core Data 【发布时间】:2016-09-05 14:20:49 【问题描述】:

我是 Core Data 的新手,但对于我的一个新项目,我想将我的数据保存到 Core Data。 我想创建一个包含几个自定义类数组的 Reptile 类。如果没有 Core Data,我会有这样的东西:

import Foundation
import UIKit

class Reptile_ 

    private var _name: String?
    private var _dateOfBirth: String?
    private var _morph: String?
    private var _breed: String?
    private var _feedingPeriodInDays: Int?
    private var _reminderTime: NSDate?
    private var _idealTemperatureAtDay: String?
    private var _idealTemperatureAtNight: String?
    private var _gender: Gender?
    private var _image: UIImage?
    private var _imageHeader: UIImage?

    private var _sheddings: [Shedding_]?
    private var _feedings: [Feeding_]?
    private var _defecations: [Defecation_]?
    private var _weights: [Weight_]?
    private var _lengths: [Length_]?
    private var _others: [Others_]?


例如Weight_ 类看起来像这样:

import Foundation

class Weight_ 

    private var _date: NSDate?
    private var _weight: Double?


我可以使用 Core Data 将具有某些属性的单个类保存为字符串、布尔数据……但我不知道如何保存自定义对象的数组?

我在某处读到需要使用基本 Reptile 类创建关系(一对多)。所以我做了这导致了这个:

这是添加自定义对象数组的正确方法吗?如果是这样,我该如何继续(只需单击“CreateNSManagedObject Subclass...”?)?如何将实例添加到数组?如何阅读?

【问题讨论】:

【参考方案1】:

您是正确的,在 Core Data 中拥有自定义数组包括为这些项目创建 Core Data 对象并通过关系将它们连接起来,就像您在您发布的图表中所做的那样。

如何继续(只需单击“CreateNSManagedObject Subclass...”?)?

现在您已经有了一个对象图,下一步很大程度上取决于您使用的是 Xcode 7 还是 Xcode 8。对于前者,您应该单击创建子类按钮。然后,如果您的数据模型发生任何变化,您将需要重新生成子类。

然而,在后者(Xcode 8)中,当在 Core Data 对象模型文件中选择实体时,您需要做的就是查看属性检查器中的“Codegen”下拉菜单。如果您选择“类定义”,Xcode 8 应该会为您生成类。 “Category/Extension”意味着它将创建一个包含访问 Core Data 所需的所有代码的扩展,并且您需要声明实际的类定义。无论哪种情况(在 Xcode 8 中),这些都会在您更改对象模型时自动更新(目前仅在重建之后,并且它们不可见)。

图片来自Core Data WWDC16 session

如何阅读?

假设您尚未在 Core Data 中设置排序,它将以 NSSet 的形式返回,但您可以将其转换为数组:

reptileInstance.lengths.allObjects as! [Length]

如何将实例添加到数组中?

你可以做一些简单的事情,比如:

lengthInstance.reptile = reptileInstance

在这种情况下,lengthInstance 将自动添加到reptileInstancelengths 集合属性中,或者您可以在reptileInstance 上将新的NSSet 设置为lengths

这是一个非常简单的解释。您应该查看Core Data Programming Guide,但请注意它可能会或可能不会针对即将推出的 Xcode 8 进行更新。

【讨论】:

以上是关于Swift:在 Core Data 中存储自定义类的数组的主要内容,如果未能解决你的问题,请参考以下文章

在 Core Data 中保存一组自定义类

iOS:Swift:Core Data:值不使用 Private ManagedObjectContext 存储

在 Core Data 中存储 URLSessionDownloadTask

swift 在Core Data中存储Swift值类型

Core Data:为啥要创建自定义持久存储?

如何在 Core Data 中存储一组自定义(和重复)对象?