Macos 从弹出按钮插入Cocoa核心数据项目关系
我有一个包含两个实体的核心数据:“CarEntity”和“PassengerEntity” 现在,每个实体都有一个名为“name”的属性。谨慎性与乘客性之间存在一种多对多的关系,称为“乘客”,而乘客性与乘客性之间存在一种反向关系“化身” 所以,我做了这个界面来插入一个新的乘客 我有一个NSTextField作为姓名,还有一个NSPoupButton用于选择汽车。 弹出按钮有一个“内容值”绑定到NSController阵列,允许我获取所有汽车 然后我有一个按钮来保存一切。标题代码如下所示:Macos 从弹出按钮插入Cocoa核心数据项目关系,macos,cocoa,core-data,osx-snow-leopard,Macos,Cocoa,Core Data,Osx Snow Leopard,我有一个包含两个实体的核心数据:“CarEntity”和“PassengerEntity” 现在,每个实体都有一个名为“name”的属性。谨慎性与乘客性之间存在一种多对多的关系,称为“乘客”,而乘客性与乘客性之间存在一种反向关系“化身” 所以,我做了这个界面来插入一个新的乘客 我有一个NSTextField作为姓名,还有一个NSPoupButton用于选择汽车。 弹出按钮有一个“内容值”绑定到NSController阵列,允许我获取所有汽车 然后我有一个按钮来保存一切。标题代码如下所示: IBO
IBOutlet NSTextField *newPassengerNameField;
IBOutlet NSPopUpButton *newPersonCarField;
- (IBAction)saveNewPassenger:(id)sender {
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
NSManagedObject *newPassengerObject = [
NSEntityDescription
insertNewObjectForEntityForName:@"PassengerEntity"
inManagedObjectContext:managedObjectContext
];
//Here we have all the fields to be inserted.
[newPassengerObject setValue:[newPassengerNameField stringValue] forKey:@"name"];
//Car ?????
}
实施过程如下:
IBOutlet NSTextField *newPassengerNameField;
IBOutlet NSPopUpButton *newPersonCarField;
- (IBAction)saveNewPassenger:(id)sender {
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
NSManagedObject *newPassengerObject = [
NSEntityDescription
insertNewObjectForEntityForName:@"PassengerEntity"
inManagedObjectContext:managedObjectContext
];
//Here we have all the fields to be inserted.
[newPassengerObject setValue:[newPassengerNameField stringValue] forKey:@"name"];
//Car ?????
}
好的,这个代码很好用。。为了名字。但我不知道如何插入车的关系
我的应用程序强制用户在进入此阶段之前创建一辆汽车,因此我在CarEntity中有对象
问题是:如何获取弹出按钮的值并将其发送给此插入代码
谢谢 这非常有效,但是非常感谢在清理代码方面的任何帮助
[newPassengerObject setValue:[newPassengerNameField stringValue] forKey:@"name"];
//Continuing from old code.
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"name = %@", [[newPersonCarField selectedItem] title]];
NSEntityDescription *modelEntity = [NSEntityDescription entityForName:@"CarEntity" inManagedObjectContext:managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:modelEntity];
[fetchRequest setPredicate:predicate];
NSArray *results = [managedObjectContext executeFetchRequest:fetchRequest error:nil];
[fetchRequest release];
[newPassengerObject setValue:[results objectAtIndex:0] forKey:@"inCar"];
//Code goes on from here.
//代码清理注释 1:为什么使用“setValue:forKey”?您还没有自动生成实体类文件吗。如果已生成,则可以将实体视为自定义对象。例如,我正在学习你的代码。如果您有实体类文件,可以像下面这样修改它
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
PassengerEntity *newPassengerObject = [
NSEntityDescription
insertNewObjectForEntityForName:@"PassengerEntity"
inManagedObjectContext:managedObjectContext
];
newPassengerObject.name = [newPassengerNameField stringValue];
2:不要在您的saveNewPassenger:方法中混淆核心数据代码。它不适用于核心数据操作。在这种情况下,为什么要在该方法中编写核心数据代码?这只会导致代码重复。最好编写一个与核心数据通信的“接口类”。这将提高模块性和代码重用性