Основные данные iPhone, вставка новых объектов - PullRequest
18 голосов
/ 15 ноября 2009

Я читал документацию по основным данным и чувствую, что мне все еще что-то не хватает.

Я не совсем понимаю, как вы вставляете объекты в отношения другого объекта.

Например, следующие две сущности есть в моей модели

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, содержащих информацию о текущих прибытиях и вылетах для этого аэропорта.

В настоящее время мое понимание заключается в том, чтобы вставить данные рейса для конкретной доски вылета, я должен получить управляемый объект для доски, затем создать новый управляемый объект для каждого рейса и установить его значения соответствующим образом, а затем создать NSSet, содержащий управляемый рейс. объекты и установить depatureboards managedObject current_flights (отношение) к только что созданному NSSet. Это правильно?

Что если я хочу добавить новые записи? Я полагаю, мне не нужно сначала получать весь набор?

Спасибо за любую помощь ..


Хотя я только что понял, что могу вместо этого установить отношение к текущему объекту на объекте flightDetails ..

Ответы [ 2 ]

25 голосов
/ 16 ноября 2009

Есть несколько вариантов:
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];

Для получения дополнительной информации посмотрите Методы доступа к управляемым объектам .

25 голосов
/ 16 ноября 2009

Когда вы определяете отношение в модели данных, набор определяется в заголовке содержащего объекта. Просто добавьте или удалите элементы из набора, используя обычные методы NSMutableSet.

Чтобы добавить новый управляемый объект, вы сделаете что-то вроде:

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

Если вы возьмете образец Location от Apple и поработаете оттуда, вы его озадачите, хотя он не содержит никаких связей. Чтобы все это заработало, просто измените свою модель данных на то, какой она должна быть, и не думайте об этом как о связях, просто думайте об этом как "A имеет NSMutableSet of B". Поскольку вы определили обратную связь как рекомендованную документацию, вам не нужно думать о том, что B имеет в отношении A, просто начните думать в терминах B, когда это объект, который имеет значение для вас.

Допустим, у вас есть объект Airport, у которого есть объект Board (и представьте, что вы задали пункт отправления и назначения в Flight с помощью переменной routingArray, затем просто создайте свои объекты Flight по мере необходимости и установите отношения как:

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

Когда рейс отменен (проклинаю вас, Юнайтед!), Вы можете просто удалить Рейс из этого набора, и любой, кто попытается получить доступ к объекту, где он был, видит ноль, так что вы можете весело испортить день пассажиров. 1012 *

...