2012-04-29 4 views
0

私は2つのエンティティ(CarEntityとPassengerEntity)を持つコアデータを持っています。ポップアップボタンからのCocoaコアデータプロジェクト関係の挿入

ここで、各エンティティには「名前」という属性があります。 CarEntityは「乗客」と呼ばれるPassengerEntityと多対多の関係を持ち、PassengerEntityは逆の関係「inCar」を持ちます。

私はこのインターフェースを使って新しい乗客を挿入しました。

人の名前のNSTextFieldと、車を選択するNSPopUpButtonが1つあります。 ポップアップボタンにはNSControllerArrayにバインディングされた "コンテンツ値"があり、すべての車を取得できます。

私はすべてを保存するボタンが1つあります。ヘッダコードは次のようになります:

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にオブジェクトがあります。

質問:私はどのようにポップアップボタンの値を取得し、この挿入コードに送信するのですか?

ありがとうございます!

答えて

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. 
0

//コードはコメント

1のクリーニング:なぜあなたは ':forKeyのsetValue' を使用していますか? Entityクラスファイルを自動生成していませんか?生成していれば、エンティティをカスタムオブジェクトのように扱うことができます。たとえば。あなたのコードを拾っています。方法:あなたのsaveNewPassengerにコアデータコードを混在させないでください:あなたは、エンティティ・クラス・ファイル

NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; 

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

2を持っていたかどうかは、以下のように変更することができます。それはコアデータ操作のためのものではありませんでした。その場合、なぜそのメソッドの中にCOreデータコードを記述しますか?それはコードの繰り返しに終わるだけです。コアデータと通信するための「インタフェースクラス」を作成することをお勧めします。これにより、モジュール性とコードの再利用性が向上します

関連する問題