如何在核心数据中保存关系实体

时间:2014-08-22 04:55:14

标签: ios objective-c core-data

我是核心数据的新手,所以请放轻松我。 :)我目前在Xcode 5中使用iOS 7.

我有两个实体:飞机条目一架飞机多次进入关系。

我试图保存一个新的Entry,其中包含一个飞机物体。这是我的Entry.h文件(减去#import):

//  Entry.h
@class Aircraft;

@interface Entry : NSManagedObject
  @property (nonatomic, retain) NSNumber *duration;
  @property (nonatomic, retain) NSDate *flightDate;
  @property (nonatomic, retain) Aircraft *aircraft;
@end

同时,在我保存新条目的视图控制器中,我有以下代码。我在创建新记录之前使用字典来设置数据:

//Add New Entry
Aircraft *aircraft = [Aircraft new];
aircraft.aircraftRegistration = _aircraftRegistrationTextField.text;

NSDictionary *newEntry = @{
  @"aircraft": aircraft, //???
  @"flightDate": [formatter dateFromString:_flightDateTextField.text],
  @"duration": [PPHelpers convertHHMMtoDecimal:_durationTextField.text],
};

//Save new Entry to Core Data
PPAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];

NSManagedObject *item = [NSEntityDescription insertNewObjectForEntityForName:@"Entry" inManagedObjectContext:context];

[item setValuesForKeysWithDictionary:newEntry];

NSError *error;
[context save:&error];

我从中得到了一些错误:

CoreData: error: Failed to call designated initializer on NSManagedObject class 'Aircraft'

和...

-[Aircraft setAircraftRegistration:]: unrecognized selector sent to instance 0x110b0b550

我怀疑问题是我没有以正确的方式将飞机添加到Entry。

任何想法我做错了什么?

2 个答案:

答案 0 :(得分:3)

Aircraft *aircraft = [Aircraft new];

创建一个对象而不调用指定的初始值设定项。你应该用

替换它
Aircraft *aircraft = [NSEntityDescription insertNewObjectForEntityForName:@"Aircraft" inManagedObjectContext:context];

注意:可以使用setValuesForKeysWithDictionary设置核心数据属性, 但更直接,类型安全且不易出错的方法是使用核心数据 访问器:

Entry *entry = [NSEntityDescription insertNewObjectForEntityForName:@"Entry" inManagedObjectContext:context];
entry.aircraft = aircraft; // from above
entry.duration = ...;
entry.flightData = ...;

答案 1 :(得分:0)

如果Aircraft是父关系实体,则需要使用insertNewObjectForEntityForName对其进行实例化,它与Entry相同。

//Save new Entry to Core Data
PPAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];



//Add New aircraft
Aircraft* aircraft = (Aircraft*) [NSEntityDescription insertNewObjectForEntityForName:[NSClassFromString(Aircraf) inManagedObjectContext:context];
aircraft.aircraftRegistration = _aircraftRegistrationTextField.text;


Entry* item = (Entry*) [NSEntityDescription insertNewObjectForEntityForName:NSClassFromString(Entry) inManagedObjectContext:context];

[item setAircraft:aircraft];
[item setFlightDate:[formatter dateFromString:_flightDateTextField.text]];
[item setDuration:[PPHelpers convertHHMMtoDecimal:_durationTextField.text]];


NSError *error;
[context save:&error];