我是核心数据的新手,所以请放轻松我。 :)我目前在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。
任何想法我做错了什么?
答案 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];