0

我有一个包含 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 中有对象。

问题是:如何获取弹出按钮的值并将其发送到此插入代码?

谢谢!

4

2 回答 2

0

// 代码清理注释

1:你为什么使用'setValue:forKey'?你没有自动生成你的实体类文件。如果您已生成,则可以将实体视为自定义对象。例如。我正在拿起你的一段代码。如果你有实体类文件,它可以像下面这样修改

NSManagedObjectContext *managedObjectContext = [self managedObjectContext];

PassengerEntity *newPassengerObject = [
    NSEntityDescription
        insertNewObjectForEntityForName:@"PassengerEntity"
                 inManagedObjectContext:managedObjectContext
];
newPassengerObject.name = [newPassengerNameField stringValue];

2:不要在你的saveNewPassenger : 方法中混淆核心数据代码。它不适用于 Core Data 操作。既然如此,为什么要在那个方法里面写 COre 数据代码呢?它只会导致代码重复。最好编写一个“接口类”来与核心数据通信。这将增加模块化和代码可重用性

于 2012-05-01T12:34:07.240 回答
0

这非常有效,但是非常感谢您在清理代码方面的任何帮助!

[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.
于 2012-04-30T15:26:16.827 回答