核心数据自定义可转换对象类数组

时间:2019-01-24 00:37:03

标签: ios swift core-data nsobject nscoding

重要

我了解到,我在下面所做的并不是解决问题的最明智的方法。我很想知道我的问题的解决方案,但是现在我能够通过使用核心数据一对多关系来实现我的目标,这行得通!

原始帖子

我有一个名为TestPeriods的核心数据实体,并且我希望它具有一个名为periods的属性,该属性是可转换的,并且由一个名为PeriodClass的自定义类的数组组成

总而言之,当我尝试访问保存在实体中的期间时出了点问题,就像您最后看到的那样。

这是我的实体扩展名

extension TestPeriods {

@nonobjc public class func fetchRequest() -> NSFetchRequest<TestPeriods> {
    return NSFetchRequest<TestPeriods>(entityName: "TestPeriods")
}

@NSManaged public var periods: [PeriodClass]?

}

这里是PeriodClass,带有开始,结束和句点

public class PeriodClass: NSObject, NSCoding {


var start: Date?
var end: Date?
var period: Int16?

public func encode(with aCoder: NSCoder) {
    aCoder.encode(start, forKey: "start")
    aCoder.encode(end, forKey: "end")
    aCoder.encode(period, forKey: "period")
}


public required init?(coder aDecoder: NSCoder) {
    start = aDecoder.decodeObject(forKey: "start") as! Date
    end = aDecoder.decodeObject(forKey: "end") as! Date
    period = aDecoder.decodeObject(forKey: "period") as! Int16
}


init(start: Date, end: Date, period: Int16) {
    super.init()
    self.start = start
    self.end = end
    self.period = period
}

}

这是我保存到TestPeriods实体的方式

let container = TestPeriods(context: PersistenceServce.context)
// The 'period' I refer to below is just an object with the same start, end, and period and I know is not nil
let x = PeriodClass(start: period.start!, end: period.end!, period: period.period)
container.periods?.append(x)

// Saving the object here
PersistenceServce.saveContext()
// I know this Persistence Service is not a problem as I use it for other Core Data Objects

问题是当我尝试检索PeriodClass数组时

let tFetch: NSFetchRequest<TestPeriods> = TestPeriods.fetchRequest()
    do {
        let classes = try PersistenceServce.context.fetch(tFetch)
        print("TEST CLASS COUNT \(classes.count)")
        ...
    }

在这里,因为我之前保存了一个带有多个句点的实体,所以它会打印1

但是,当我打电话

print("TEST CLASS PERIODS \(classes[0].periods)")

我得到的都是零

由于某种原因,它正在保存实体,但没有正确保存应该伴随的期间。请让我知道我在做什么错以及如何解决此问题。谢谢!

1 个答案:

答案 0 :(得分:0)

看起来container.periods为零,因此该行:

container.periods?.append(x)

什么都不做。您需要将periods初始化为一个空数组,然后才能向其中添加项目。或者对于第一个项目,只需创建一个包含该项目的数组:

container.periods = [x]