0

「CarEntity」と「PassengerEntity」の 2 つのエンティティを持つコアデータがあります。

現在、各エンティティには「name」という属性があります。CarEntity は、'passengers' と呼ばれる 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 にオブジェクトがあります。

問題は、ポップアップ ボタンの値を取得して、この挿入コードに送信するにはどうすればよいかということです。

ありがとう!

4

2 に答える 2

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 に答える
0

// コードクリーニングのコメント

1: なぜ「setValue:forKey」を使用するのですか? エンティティ クラス ファイルを自動生成していませんか。生成した場合、エンティティをカスタム オブジェクトのように扱うことができます。たとえば。私はあなたのコードを拾っています。Entity クラス ファイルがある場合は、以下のように変更できます。

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 に答える