从弹出按钮插入 Cocoa 核心数据项目关系
Posted
技术标签:
【中文标题】从弹出按钮插入 Cocoa 核心数据项目关系【英文标题】:Cocoa core data project relationship insertion from popup button 【发布时间】:2012-04-29 20:27:08 【问题描述】:我有一个包含 2 个实体的核心数据:“CarEntity”和“PassengerEntity”。
现在,每个实体都有一个名为“名称”的属性。 CarEntity 与称为“passengers”的PassengerEntity 具有一对多关系,而PassengerEntity 具有“inCar”的反向关系。
所以,我做了这个界面来插入一个新的乘客。
我有一个用于人名的 NSTextField 和一个用于选择汽车的 NSPopUpButton。 弹出按钮有一个“内容值”绑定到一个 NSControllerArray,它允许我获取所有的汽车。
然后我有一个按钮来保存所有内容。标头代码如下:
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 中有对象。
问题是:如何获取弹出按钮的值并将其发送到此插入代码?
谢谢!
【问题讨论】:
【参考方案1】:这非常有效,但非常感谢您在清理代码方面的任何帮助!
[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.
【讨论】:
【参考方案2】:// 代码清理cmets
1:你为什么使用'setValue:forKey'?你没有自动生成你的实体类文件。如果您已生成,则可以将实体视为自定义对象。例如。我正在拿起你的一段代码。如果你有实体类文件,它可以像下面这样修改
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
PassengerEntity *newPassengerObject = [
NSEntityDescription
insertNewObjectForEntityForName:@"PassengerEntity"
inManagedObjectContext:managedObjectContext
];
newPassengerObject.name = [newPassengerNameField stringValue];
2:不要在 saveNewPassenger: 方法中混淆核心数据代码。它不适用于 Core Data 操作。既然如此,为什么要在那个方法里面写 COre 数据代码呢?它只会导致代码重复。最好编写一个“接口类”来与核心数据通信。这将增加模块化和代码可重用性
【讨论】:
以上是关于从弹出按钮插入 Cocoa 核心数据项目关系的主要内容,如果未能解决你的问题,请参考以下文章