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

Swift: Store arrays of custom classes in Core Data

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

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_]?

}

例如class Weight_ 看起来像这样:

import Foundation

class Weight_ {

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

}

我可以使用 Core Data 来保存单个 class 以及一些属性,如字符串、布尔数据...但是我不知道如何保存自定义对象的数组?

我在某处读到我需要与基础 Reptile class 创建关系(一对多)。所以我做了这件事:

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

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

How do I continue (simply click 'CreateNSManagedObject Subclass...'?)?

现在你有了一个对象图,下一步很大程度上取决于你有Xcode7还是Xcode8。如果是前者,你应该点击create subclass 按钮。然后,如果您的数据模型发生任何变化,您将需要重新生成子classes。

在后者 (Xcode 8) 中,然而,当一个实体在 selected核心数据对象模型文件。如果你 select "Class Definition",Xcode 8 应该为你生成 class。 "Category/Extension" 意味着它将创建一个扩展,其中包含访问核心数据所需的所有代码,您需要声明实际的 class 定义。在任何一种情况下(在 Xcode 8 中),当您更改对象模型时,这些都会自动更新(目前仅在重建之后,它们将不可见)。

图片来自Core Data WWDC16 session

How do I read it?

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

reptileInstance.lengths.allObjects as! [Length]

How do I add a instance to the array?

您可以做一些简单的事情,例如:

lengthInstance.reptile = reptileInstance

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

这是一个非常简单的解释。您应该查看 Core Data Programming Guide,但请注意它可能会或可能不会为即将到来的 Xcode 8.

更新