Ejemplo de relación transitoria de CoreData

¿Alguien tiene un ejemplo sobre cómo modelar y codificar una relación transitoria a uno en CoreData? Por ejemplo, tengo 2 entidades con una relación de uno a varios. Doctor y cita. Ahora quiero una relación transitoria llamada MostRecentAppointment en la entidad del médico. Es sencillo modelar en el diseñador xcode, pero no estoy seguro sobre el lado de la implementación. ¿También debo implementar un inverso? Parece tonto

Eche un vistazo a este código que escribí recientemente, para almacenar en caching una image en un NSManagedObject:

En primer lugar, defina una propiedad transitoria en su model (observe que si su propiedad transitoria apunta a un tipo de object distinto de los soportados por CoreData, lo dejará como " Undefined " en el model)

introduzca la descripción de la imagen aquí

Luego, vuelve a generar tu subclass NSManagedObject para esa entidad o simplemente agrega la nueva propiedad manualmente, el file de encabezado debería verse así:

 @interface Card : NSManagedObject @property (nonatomic, retain) NSString * imagePath; @property (nonatomic, retain) NSString * name; @property (nonatomic, retain) NSNumber * order; @property (nonatomic, retain) NSString * displayName; @property (nonatomic, retain) UIImage *displayImage; @end 

Aquí cambiamos la class de la propiedad transitoria al tipo de class real

Por ejemplo, el tipo de image de displayImage aquí es UIImage .

En el file de implementación (o una class de extensión) implementas el getter / setter para tu propiedad transitoria:

 -(UIImage*)displayImage{ //Get Value [self willAccessValueForKey:@"displayImage"]; UIImage *img = (UIImage*)[self primitiveValueForKey:@"displayImage"]; [self didAccessValueForKey:@"displayImage"]; if (img == nil) { if ([self imagePath]) { //That is a non-transient property on the object img = [UIImage imageWithContentsOfFile:self.imagePath]; //Set Value [self setPrimitiveValue:img forKey:@"displayImage"]; } } return img; } 

Espero que te ayude.

Lo que debe hacer es agregar una entidad de tipo Cita llamada newAppointment y establecerla cada vez que cree una nueva cita para un médico determinado. Es así de simple.

Siempre implementa un inverso ya que Apple recomienda esto para la validation y la eficiencia de los datos centrales.

Alternativamente, puede marcar el time de las citas y usar NSPnetworkingicates para search la cita más reciente en las citas vinculadas de un Doctor determinado.

Bueno, solo tendrás que probar, en tu propio progtwig de ejemplo, que no puede ser más de una hora para configurarse correctamente.

Mi conjetura es que no se necesitará una encoding adicional. Si la documentation de Apple en CoreData es correcta, la única diferencia entre un atributo / relación normal y uno "transitorio" es que este último no se mantiene, es decir, cuando "guarda" no actualiza el almacén persistente.

Supongo que, de lo contrario, todos los aspectos del mismo están completos, junto con el cumplimiento de KVO / KVC, el soporte de Deshacer, la validation y la actualización automática mediante reglas de eliminación. Lo único es que después de una nueva búsqueda de la entidad, la relación transitoria siempre será nula.

Por eso, por supuesto, NO RECOMIENDO establecer una relación transitoria como "no opcional", porque es muy probable que sea nula la mayor parte del time para la mayoría de las entidades.

Yo establecería una relación inversa (también transitoria y nombrada sabiamente) y las dos reglas de eliminación serían "Nulificar".

Hasta ahora es por una relación transitoria.

Pero he aquí una alternativa que se me ocurrió, tratando de resolver casi el mismo problema. Mi "cita" es una de las citas relacionadas, pero no solo la "última", sino la primera "sin terminar". Muy similar a la lógica.

En lugar de una relación transitoria, agregué una nueva propiedad calculada a la subclass NSManagedObject generada por las entidades "Doctor", en una categoría, así:

 @interface XXDoctor (XXExtensions) /** @brief Needs manual KVO triggering as it is dependent on a collection. Alternatively, you can observe insertions and deletions of the appointments, and trigger KVO on this propertyOtherwise it can be auto- @return the latest of the to-many appointments relation. **/ @property (readonly) XXAppointment *latestAppointment; // defined as the @end 

Implementación:

 #import "XXDoctor".h" #import "XXAppointment.h" @implementation XXDoctor (XXExtensions) // this won't work because "appointments" is a to-many relation. //+ (NSSet *)keyPathsForValuesAffectingLatestAppointment { // return [NSSet setWithObjects:@"appointments", nil]; //} - (XXAppointment *) latestAppointment { NSInteger latestAppointmentIndex = [self.appointments indexOfObjectPassingTest:^BOOL(XXAppointment *appointment, NSUInteger idx, BOOL *stop) { *stop = (appointment.dateFinished == nil); return *stop; }]; return (latestAppointmentIndex == NSNotFound) ? nil : [self.appointments objectAtIndex: latestAppointmentIndex]; } @end