2009-11-15 3 views
18

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

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

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

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


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

+0

Когда вы говорите '[авиабилеты addObject: details]' вы получаете предупреждение о компиляторе? Я вижу, что отношения - это NSSet, а не NSMutableSet. – user798719

ответ

25

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

+0

Фантастическая благодарность это в значительной степени именно то, что мне было интересно. Мне удалось выполнить задачу с чем-то подобным, но после отражения я все еще не совсем понял. –

+0

Я забыл сказать - первое, что происходит после изменения модели данных, - это то, что все сбой - либо вы меняете имя файла хранилища в функциях инициализации Core Data (не так), либо добавляете версию к модель данных (правильный путь) - просто пойдите немного дальше в большие документы компакт-дисков, и вы обнаружите, что добавить модельную версию очень просто. Если вы довольны ответом, то прием всегда приветствуется. –

25

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

Для получения дополнительной информации, ознакомьтесь Managed Object Accessor Methods.

+0

Отличное спасибо, я понимаю это сейчас. Я просто не мог понять решение из документов. –

+0

Если вы нашли этот ответ или полезным для Адама, пожалуйста, примите один из них. – gerry3

+0

Извините, новичок на этом сайте. Оба ответа были в равной степени полезны в реальности. Спасибо за помощь, очень ценю. –

Смежные вопросы