您可以将乘客添加到一个旅行实体,但是由于属性类型受到限制,您必须使用
transformable
对对象进行归档和取消归档可能会非常昂贵。
如果源数据是JSON,最有效的方法是为
Passenger
和
Trip
并添加反向关系。然后使一切
NSManagedObject
课堂采用
Codable
并添加
init(from decoder
和
encode(to encoder:
每个类的方法。
例如,假设
旅行
类与
乘客
看起来像
@NSManaged public var tripNumber: Int32
@NSManaged public var passengers: Set<Passenger>
而在
乘客
类有一个属性
trip
@NSManaged public var trip: Trip?
这是必需的
Decodable
初始化器
旅行
. 解码器可以对数组和集合进行解码。
private enum CodingKeys: String, CodingKey { case tripNumber, passengers }
public required convenience init(from decoder: Decoder) throws {
guard let context = decoder.userInfo[.context] as? NSManagedObjectContext else { fatalError("Context Error") }
let entity = NSEntityDescription.entity(forEntityName: "Trip", in: context)!
self.init(entity: entity, insertInto: context)
let values = try decoder.container(keyedBy: CodingKeys.self)
tripNumber = try values.decode(Int32.self, forKey: .tripNumber)
passengers = try values.decode(Set<Passenger>.self, forKey: .passengers)
passengers.forEach{ $0.trip = self }
}
反向关系是通过
forEach
线。
您必须添加扩展名
JSONDecoder
能通过电流
NSManagedObjectContext
在
userInfo
对象。
相应的编码器是“非常简单的”
public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(tripNumber, forKey: .tripNumber)
try container.encode(passengers, forKey: .passengers)
}
被管理对象
课程采用
可编的
对于从JSON数据预填充数据库或进行JSON备份非常舒适。