Vous pouvez utiliser le Codable interface avec CoreData objets d'encoder et de décoder des données, cependant il n'est pas aussi automatique que lorsqu'il est utilisé avec un bon vieux swift objets. Voici comment vous pouvez mettre en œuvre Décodage JSON directement avec la Base de Données des objets:
Tout d'abord, vous rendre votre objet de mettre en œuvre Codable. Cette interface doit être défini sur l'objet, et non pas dans une extension. Vous pouvez également définir vos Clés de Codage dans cette classe.
class MyManagedObject: NSManagedObject, Codable {
@NSManaged var property: String?
enum CodingKeys: String, CodingKey {
case property = "json_key"
}
}
Ensuite, vous pouvez définir la méthode init. Cela doit également être définie dans la méthode de la classe parce que la méthode init est requis par la Décodable protocole.
required convenience init(from decoder: Decoder) throws {
}
Cependant, l'initialiseur correct pour une utilisation avec des objets gérés est:
NSManagedObject.init(entity: NSEntityDescription, into context: NSManagedObjectContext)
Donc, le secret ici est d'utiliser le userInfo dictionnaire de passer dans le contexte de l'objet dans l'initialiseur. Pour ce faire, vous aurez besoin d'étendre l' CodingUserInfoKey
struct avec une nouvelle clé:
extension CodingUserInfoKey {
static let context = CodingUserInfoKey(rawValue: "context")
}
Maintenant, vous pouvez juste que le décodeur pour le contexte:
required convenience init(from decoder: Decoder) throws {
guard let context = decoder.userInfo[CodingUserInfoKey.context!] as? NSManagedObjectContext else { fatalError() }
guard let entity = NSEntityDescription.entity(forEntityName: "MyManagedObject", in: context) else { fatalError() }
self.init(entity: entity, in: context)
let container = decoder.container(keyedBy: CodingKeys.self)
self.property = container.decodeIfPresent(String.self, forKey: .property)
}
Maintenant, lorsque vous configurez le décodage des Objets Gérés, vous aurez besoin de passer le long du contexte de l'objet:
let data = //raw json data in Data object
let context = persistentContainer.newBackgroundContext()
let decoder = JSONDecoder()
decoder.userInfo[.context] = context
_ = try decoder.decode(MyManagedObject.self, from: data) //we'll get the value from another context using a fetch request later...
try context.save() //make sure to save your data once decoding is complete
Pour encoder les données, vous aurez besoin de faire quelque chose de similaire à l'aide de l' encoder protocole de fonction.
0 votes
Un bon exemple qui utilise la réponse acceptée peut être trouvé aquí