Подтвердить что ты не робот

Основные данные 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.

4b9b3361

Ответ 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.