iOS核心数据可转换

时间:2018-02-20 14:36:42

标签: ios core-data transformable

我对iOS CoreData实现相对较新。这是我的问题:

我有一个拥有资产的实体'可能包含一个或多个不同类型对象的字段。它是另一个的子对象。存储它的最佳方法是什么以及如何检索它。

我的伪代码示例:

extension Group (
    @NSManaged public var created: NSDate?
    @NSManaged public var type: String?
    @NSManaged public var people: NSSet?
}

extension Person {
    @NSManaged public var created: NSDate?
    @NSManaged public var type: String?
    @NSManaged public var asset: NSObject?  //marked as transformable in data model
}

在Person.asset中,它可以是一个或几个不同类对象的组合:

extension Car {..}
extension House { ...} 
etc. 

我目前的保存方法是创建个人资产类型并添加到此人;

let myGroup = Group(...)
let person1 = Person(...)
let hisCar = Car(..) 
person1.asset = hisCar
myGroup.addPersonObject(person: person1)

let person2 = Person(...)
let hisHouse = House(...) 
person2.asset = hisHouse
myGroup.addPersonObject(person: person2)

在我保存上下文之前,以下内容似乎有效,我可以通过以下方式访问Person对象:

let peopleInGroup = Group.people!
for case let person as Person in peopleInGroup {
    if person.type != "" {
        print (person.type as! String)
    }
}

直到我保存上下文并重新加载应用程序。在加载应用程序时,我获取Group对象,然后尝试执行上面相同的代码。它似乎指向正确的人物对象,但在person.type行上失败,我最终得到一个错误: [error] error:异常处理请求:, - [Asset initWithCoder:]:无法识别的选择器发送到实例0x60c00027e040,userInfo为(null)

我相信在保存和获取时我可能需要在资产字段上进行某种编码?即使我尝试访问此人的类型属性,该错误也引用了资产。在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

通过在属性值上使用NSCoding,可转换属性起作用。如果asset具有多种类型,只要所有类型都符合NSCoding,则无关紧要。如果将其添加到您的各种类型是一个问题,您将不得不找到一些其他方法来保存资产信息。