understanding tutorial framework español data ios cocoa-touch core-data swift

tutorial - ¿Cómo asignar la relación de varios a varios de CoreData en Swift?



swift ios documentation (7)

@Nycen tiene la mejor solución para Xcode 7 con los métodos ahora implementados automáticamente, sin embargo, tenga en cuenta que el problema NSOrderedSet casi increíblemente existe (vea esta pregunta ), así que si usa un NSOrderedSet para su relación en lugar de un NSSet , necesitará usar una solución alternativa

(Hubiera comentado en lugar de publicar una nueva respuesta, pero me faltan puntos)

Tengo una clase NSManagedObject

class Disease: NSManagedObject { @NSManaged var diseaseId: String @NSManaged var diseaseName: String @NSManaged var dogBreed: NSSet }

¿Cómo agrego una nueva relación a dogBreed? Si cambio el tipo var a NSMutableSet, los cambios no se guardan en la base de datos. ¿Algunas ideas?


A partir de Xcode 7 y Swift 2.0, la nota de lanzamiento 17583057 establece:

El atributo NSManaged se puede usar con métodos así como con propiedades, para acceder a los accesos a muchos accesadores de Core Data generados automáticamente y que cumplen con Key-Value-Coding.

@NSManaged var employees: NSSet @NSManaged func addEmployeesObject(employee: Employee) @NSManaged func removeEmployeesObject(employee: Employee) @NSManaged func addEmployees(employees: NSSet) @NSManaged func removeEmployees(employees: NSSet)

Estos pueden declararse en su subclase NSManagedObject. (17583057)

Entonces solo tiene que declarar los siguientes métodos y CoreData se encargará del resto:

@NSManaged func addDogBreedsObject(dogBreed: DogBreed) @NSManaged func removeDogBreedsObject(dogBreed: DogBreed) @NSManaged func addDogBreeds(dogBreeds: NSSet) @NSManaged func removeDogBreeds(dogBreeds: NSSet)


Como una extensión a @Naz. Y en combinación con el comentario de @ Ash. He encontrado la única solución de trabajo para xCode 6.3.1

import CoreData extension NSManagedObject { func addObject(value: NSManagedObject, forKey: String) { self.willChangeValueForKey(forKey, withSetMutation: NSKeyValueSetMutationKind.UnionSetMutation, usingObjects: NSSet(object: value) as Set<NSObject>) var items = self.mutableSetValueForKey(forKey); items.addObject(value) self.didChangeValueForKey(forKey, withSetMutation: NSKeyValueSetMutationKind.UnionSetMutation, usingObjects: NSSet(object: value) as Set<NSObject>) } }

Debe llamar a los manejadores de cambio de voluntad y de cambio de orden para agregar correctamente un objeto a una relación de muchos en Swift.

myManagedObject.addObject(value, forKey: "yourKey")


En realidad, puedes escribir:

@NSManaged var dogBreed: Set<DogBreed>

Y use los métodos de insert y remove del Set directamente.


Si está buscando un enfoque simple, solo use esto.

import CoreData extension NSManagedObject { func addObject(value: NSManagedObject, forKey: String) { var items = self.mutableSetValueForKey(forKey); items.addObject(value) } }

La implementación:

department.addObject(section, forKey: "employees")

En lugar de escribir el mismo método en cada clase NSManageObject que lo necesita.


Si necesita usar un NSOrderedSet lugar de NSSet , he estado usando el siguiente código que facilita el NSMutableOrderedSet métodos NSMutableOrderedSet para agregar, insertar y eliminar objetos.

@NSManaged private var myOrderedSet: NSOrderedSet var myMutableOrderedSet: NSMutableOrderedSet { return self.mutableOrderedSetValueForKey("myOrderedSet") }


Swift no puede generar acceso dinámico en tiempo de ejecución debido a un sistema de tipo estricto. Puede crear una extensión para Disease clase Disease y agregar los métodos perdidos manualmente, aquí está el código:

extension Disease { func addDogBreedObject(value:DogBreed) { var items = self.mutableSetValueForKey("dogBreed"); items.addObject(value) } func removeDogBreedObject(value:DogBreed) { var items = self.mutableSetValueForKey("dogBreed"); items.removeObject(value) } }

Observaciones:

Le sugiero que cree un archivo separado para la extensión Disease+CoreData.swift , Esto debería ayudar a evitar que su código se anule cuando vuelva a generar el modelo CoreData .

Es suficiente para crear una relación en uno de los objetos administrados, el segundo se actualizará con referencia posterior. (Lo mismo que con Objective-C)

Importante: Para que todo funcione, debe verificar que los nombres de las clases de las entidades en su modelo CoreData incluyan su nombre de módulo. Por ejemplo, MyProjectName.Disease

Respuesta inspirada por: Establecer una relación NSManagedObject en Swift