2009-11-15 27 views
18

He estado leyendo la documentación de datos básicos y siento que aún me falta algo.Datos principales de iPhone insertando objetos nuevos

No entiendo muy bien cómo se insertan objetos en una relación de otro objeto.

por ejemplo los siguientes dos entidades están en mi modelo

flightDepartureBoard 
name: 
from_airport: 
to_airport: 
current_flights: (this is a one to many relationship of flight detail entities) 

flight_details 
arrive 
depart 
name 

Así que mis datos contiene una lista de las diferentes juntas de salida durante algunos aeropuertos. Cada tabla de salida contiene una serie de detalles de vuelo que contienen información sobre las llegadas y salidas actuales de ese aeropuerto.

Mi comprensión actual es insertar los detalles del vuelo para una tabla de partida específica, debo obtener el managedObject para la placa, luego crear un nuevo objeto administrado para cada vuelo y establecer sus valores según corresponda, luego crear un NSSet que conatining el vuelo administró objetos y configuró los depaneles managedObject current_flights (la relación) con el recién creado NSSet. ¿Es esto correcto?

¿Qué sucede si deseo agregar nuevas entradas? ¿Supongo que no necesito buscar todo el conjunto primero?

Gracias por cualquier ayuda ..


Aunque me di cuenta de que podía establecer la relación con el objeto actual en los flightDetails objeto en su lugar ..

+0

Cuando dice '[flights addObject: details]' ¿recibe una advertencia del compilador? Veo que la relación es un NSSet, no un NSMutableSet. – user798719

Respuesta

25

cuando se define la relación en el modelo de datos el conjunto se define en el encabezado del objeto que lo contiene. Simplemente agregue o elimine elementos del conjunto utilizando los métodos normales de NSMutableSet.

Para añadir una nueva entidad gestionada que va a hacer algo como:

Task* newTask = [NSEntityDescription insertNewObjectForEntityForName:@"Task" inManagedObjectContext:self.managedObjectContext]; 

Si agarras la muestra de Localización de Apple y trabajar desde allí se puede descifrarlo a pesar de que no contiene relaciones. Para que todo funcione, simplemente cambie su modelo de datos a lo que necesita ser y no lo considere como una relación, solo piense en ello como "A tiene un NSMutableSet de B". Debido a que usted definió la relación inversa como la documentación recomendada, no necesita pensar en lo que B tiene de A, simplemente empiece a pensar en términos de B cuando ese es el objeto que le interesa.

Digamos que usted tiene un objeto aeropuerto que tiene un objeto Junta (e imaginando configura origen y destino en vuelo con una variable routingArray, a continuación, sólo crear objetos como sea necesario su vuelo y ajustar la relación como:

Flight* newFlight = [NSEntityDescription insertNewObjectForEntityForName:@"Flight" inManagedObjectContext:self.managedObjectContext]; 
[newFlight setRoute:routingArray]; 
[Airport.Board.flights addObject:newFlight]; 

Cuando se cancela el vuelo (¡maldición, unido!) Puede simplemente eliminar el vuelo de ese conjunto y cualquiera que intente acceder al objeto donde solía verse nulo, para que pueda arruinar alegremente el día del pasajero.

+0

Fantástico gracias, esto es más o menos exactamente lo que me preguntaba. Me las arreglé para hacer la tarea con algo similar, pero después de reflexionar todavía no estaba en el blanco. –

+0

Se me olvidó decir que lo primero que sucede después de cambiar el modelo de datos es que todo falla, ya sea que cambie el nombre del archivo de almacenamiento en las funciones de inicio de Core Data (no de la manera correcta) o agrega una versión al modelo de datos (de la manera correcta): simplemente vaya un poco más allá en los grandes documentos de CD y encontrará que agregar una versión de modelo es realmente fácil. Si está contento con la respuesta, siempre se agradece una aceptación. –

25

Hay algunas opciones:
1.Se puede utilizar en una add<Key>Object: NSManagedObject:

NSManagedObject *flightBoard = [NSEntityDescription insertNewObjectForEntityForName:@"FlightDepartureBoard" inManagedObjectContext:self.managedObjectContext]; 
NSManagedObject *details = [NSEntityDescription insertNewObjectForEntityForName:@"Flight_Details" inManagedObjectContext:self.managedObjectContext]; 
[flightBoard addCurrent_flightsObject:details]; 

Aunque obtendrá una advertencia del compilador ser que se definan los descriptores de acceso en la categoria:

@interface NSManagedObject (Current_flightsAccessors) 
- (void)addCurrent_flightsObject:(NSManagedObject *)value; 
- (void)removeCurrent_flightsObject:(NSManagedObject *)value; 
- (void)addCurrent_flights:(NSSet *)value; 
- (void)removeCurrent_flights:(NSSet *)value; 
@end 

2. Esquema general. Puede generar archivos de clase de su modelo que incluirá descriptores de acceso para el a-muchas relaciones:

FlightDepartureBoard.h:

#import <CoreData/CoreData.h> 
@class Flight_Details; 
@interface FlightDepartureBoard : NSManagedObject 
{ 
} 
@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) NSString * from_airport; 
@property (nonatomic, retain) NSString * to_airport; 

@interface FlightDepartureBoard (CoreDataGeneratedAccessors) 
- (void)addCurrent_flightsObject:(Flight_Details *)value; 
- (void)removeCurrent_flightsObject:(Flight_Details *)value; 
- (void)addCurrent_flights:(NSSet *)value; 
- (void)removeCurrent_flights:(NSSet *)value; 
@end 

FlightDepartureBoard.m:

#import "FlightDepartureBoard.h" 
#import "Flight_Details.h" 
@implementation FlightDepartureBoard 
@dynamic name; 
@dynamic from_airport; 
@dynamic to_airport; 
@dynamic current_flights; 
@end 

3 . Puede obtener el conjunto mutable y modificarlo usando mutableSetValueForKey :. Por ejemplo:

NSManagedObject *flightBoard = [NSEntityDescription insertNewObjectForEntityForName:@"FlightDepartureBoard" inManagedObjectContext:self.managedObjectContext]; 
NSManagedObject *details = [NSEntityDescription insertNewObjectForEntityForName:@"Flight_Details" inManagedObjectContext:self.managedObjectContext]; 
NSMutableSet *flights = [flightBoard mutableSetValueForKey:@"current_flights"]; 
[flights addObject:details]; 

Para obtener más información, echa un vistazo a Managed Object Accessor Methods.

+0

Gracias excelentes Lo entiendo ahora. Simplemente no pude ver la solución de los documentos. –

+0

Si encontraste esta respuesta o la de Adam es útil, acepta una de ellas. – gerry3

+0

Lo sentimos todavía nuevo en este sitio. Ambas respuestas fueron igualmente útiles en la realidad. Gracias por la ayuda, muy apreciada. –

Cuestiones relacionadas