Основные данные iPhone, вставляющие новые объекты
Я читаю основную документацию по данным и чувствую, что я все еще что-то не хватает.
Я не совсем понимаю, как вы вставляете объекты в отношения другого объекта.
Например, следующие две сущности находятся в моей модели
flightDepartureBoard
name:
from_airport:
to_airport:
current_flights: (this is a one to many relationship of flight detail entities)
flight_details
arrive
depart
name
Таким образом, мои данные содержат список разных плат вылета для нескольких аэропортов. Каждая плата вылета затем содержит несколько сообщений flight_details, содержащих информацию о текущих прибытиях и отправлениях для этого аэропорта.
Мое настоящее понимание заключается в том, чтобы вставить данные о рейсе для конкретной платы вылета, я должен получить управляемый объект для доски, а затем создать новый управляемый объект для каждого рейса и установить его значения по мере необходимости, затем создать NSS, объекты и установить управляемые объекты managedObject current_flights (отношение) к только что созданному NSSet. Правильно ли это?
Что делать, если я хочу добавить новые записи? Я предполагаю, что мне не нужно сначала загружать весь набор?
Спасибо за любую помощь..
Хотя я только понял, что могу установить отношение к текущему объекту в объекте flightDetails.
Ответы
Ответ 1
При определении отношения в модели данных набор определяется в заголовке содержащего объекта. Просто добавьте или удалите элементы из набора, используя обычные методы NSMutableSet.
Чтобы добавить новый управляемый объект, вы сделаете что-то вроде:
Task* newTask = [NSEntityDescription insertNewObjectForEntityForName:@"Task" inManagedObjectContext:self.managedObjectContext];
Если вы возьмете образец местоположения из Apple и работаете оттуда, вы разобьете его, хотя в нем нет никаких отношений. Чтобы все это работало, просто измените модель данных на то, что она должна быть, и не думайте об этом как о взаимоотношениях, просто подумайте об этом как "A имеет NSMutableSet of B". Поскольку вы определили обратную связь, так как рекомендованная документация вам не нужно думать о том, что B имеет A, просто начните думать с точки зрения B, когда этот объект имеет для вас значение.
Скажем, у вас есть объект в аэропорту, у которого есть объект Board (и вы представляете, что вы устанавливаете источник и пункт назначения в полете с переменной routingArray
, а затем просто создавайте свои объекты полета по мере необходимости и устанавливайте отношения как:
Flight* newFlight = [NSEntityDescription insertNewObjectForEntityForName:@"Flight" inManagedObjectContext:self.managedObjectContext];
[newFlight setRoute:routingArray];
[Airport.Board.flights addObject:newFlight];
Когда рейс отменяется (проклинайте вас, United!), вы можете просто удалить Flight из этого набора, и любой, кто пытается получить доступ к объекту, где он раньше видел ноль, так что вы можете весело испортить день для пассажиров.
Ответ 2
Есть несколько вариантов:
1. Вы можете использовать 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];
Хотя вы получите предупреждение о компиляторе, если вы не определите аксессоров в категории:
@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. Подкласс. Вы можете создавать файлы классов из вашей модели, которые будут включать в себя аксессоры для отношений со многими:
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. Вы можете получить изменяемый набор и изменить его, используя mutableSetValueForKey:. Например:
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];
Для получения дополнительной информации, ознакомьтесь с управляемый объект Методы Accessor.