Вы можете добавить пассажиров в одну сущность Поездки, но поскольку типы атрибутов ограничены, вы должны использовать тип transformable
, который может быть довольно дорогим для архивирования и разархивирования объектов.
Наиболее эффективный способ, еслиИсходные данные JSON предназначены для создания сущностей базовых данных для Passenger
и Trip
и добавления обратных связей.Затем заставьте все NSManagedObject
классы принять Codable
и добавить методы init(from decoder
и encode(to encoder:
к каждому классу.
Например, давайте предположим, что класс Trip
имеет отношение ко-многим к Passenger
это может выглядеть как
@NSManaged public var tripNumber: Int32
@NSManaged public var passengers: Set<Passenger>
, а в классе Passenger
есть атрибут trip
@NSManaged public var trip: Trip?
, это обязательный инициализатор Decodable
в Trip
.Декодер может декодировать как массивы, так и наборы.
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)
}
NSManagedObject
классы, принимающие Codable
, очень удобны для предварительного заполнениябаза данных из данных JSON или создание резервных копий JSON.