2009-11-15 2 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 

에 있습니다. 각 출발지에는 공항의 현재 도착 및 출발 정보가 포함 된 여러 항공편 정보가 포함되어 있습니다.

현재의 이해는 특정 출발 보드의 비행 세부 정보를 삽입하는 것입니다. 보드에 대한 managedObject를 가져와야하며 각 비행에 대한 새 관리 객체를 만들고 그 값을 적절하게 설정 한 다음 비행을 고려한 NSSet을 만듭니다. depatureboards managedObject current_flights (관계)를 방금 생성 된 NSSet으로 설정합니다. 이 올바른지?

새 항목을 추가하려면 어떻게해야합니까? 먼저 전체 세트를 가져올 필요가 없다고 가정합니다. 어떤 도움

감사합니다 .. 난 그냥 내가 flightDetails의 현재 객체의 관계를 설정할 수 있습니다 실현 있지만


+0

'[flights addObject : details]'라고 말하면 컴파일러 경고 메시지가 나옵니까? NSMutableSet이 아닌 NSSet이라는 것을 알 수 있습니다. – user798719

답변

25

것은 당신이 데이터 모델에서의 관계를 정의 할 때 .. 대신 객체 집합은 포함하는 객체의 헤더에 정의됩니다. 일반 NSMutableSet 메소드를 사용하여 세트에서 항목을 추가하거나 제거하십시오. Apple의 위치 샘플을 잡아 경우

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

하고 아무 관계가없는 있지만 당신이 그것을 퍼즐합니다 거기에서 작동 :

당신이 그런 짓을하는 새로운 관리 대상 항목을 추가합니다. 모든 작업을 수행하려면 데이터 모델을 필요에 맞게 변경하고 관계로 생각하지 말고 "A에는 B의 NSMutableSet이 있습니다"라고 생각하면됩니다. 문서가 추천됨에 따라 역 관계를 정의했기 때문에 B가 A가 갖는 것에 대해 생각할 필요가 없다. B가 당신에게 중요한 객체 일 때 B로 생각하기 시작한다.

의 당신이위원회의 목적을 가진 공항 개체가 (당신은 그럼 그냥 같은 관계 당신의 비행이 필요한 객체를 생성하고 설정, 변수 routingArray와 비행에 출발지와 목적지를 설정 상상 가정 해 봅시다 :

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

비행이 취소되면 (커네즈, 유나이티드!) 그 세트에서 비행편을 삭제할 수 있습니다. 그리고 그 비행체는 아무데도 보지 못했던 물건에 접근하려고 시도하기 때문에 승객의 날을 즐겁게 망칠 수 있습니다.

+0

환상적인 고마워요.이게 내가 궁금해하던 말이야. 나는 그럭저럭 유사한 일과 함께 끝내게 될 수 있었다. 그러나 반사에 관해 나는 아직도 아주 발돋움하지 않았다. –

+0

데이터 모델을 변경 한 후에 발생하는 첫 번째 일은 모든 것이 충돌한다는 것입니다. 핵심 데이터 초기화 기능 (올바른 방법이 아님)에서 저장소 파일의 이름을 변경하거나 데이터 모델 (올바른 방법) - 더 큰 CD 문서에서 조금 더 나아가면 모델 버전을 추가하는 것이 정말 쉽다는 것을 알게 될 것입니다. 대답에 만족한다면 수락은 항상 인정됩니다. –

25

몇 가지 옵션이 있습니다.
1.당신은 NSManagedObject에 add<Key>Object:를 사용할 수 있습니다

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 :를 사용하여 수정할 수 있습니다. 예 :

자세한 내용은 Managed Object Accessor Methods을 확인하십시오.

+0

훌륭한 감사합니다. 나는 그 문서들로부터 해결책을 볼 수 없었다. –

+0

이 답변이나 아담이 유용하다고 생각되면 그 중 하나를 받아주십시오. – gerry3

+0

죄송합니다. 아직이 사이트에 새로 왔습니다. 두 답변 모두 현실적으로 똑같이 도움이되었습니다. 많은 도움을 주셔서 감사합니다. –

관련 문제