我对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)
我相信在保存和获取时我可能需要在资产字段上进行某种编码?即使我尝试访问此人的类型属性,该错误也引用了资产。在此先感谢您的帮助。
答案 0 :(得分:0)
通过在属性值上使用NSCoding
,可转换属性起作用。如果asset
具有多种类型,只要所有类型都符合NSCoding
,则无关紧要。如果将其添加到您的各种类型是一个问题,您将不得不找到一些其他方法来保存资产信息。