7

このテストコアデータプロジェクトでは、「顧客」から「製品」まで1対多の関係があり、この関係は「製品」と呼ばれます。顧客の属性は「名前」であり、製品の属性は「アイテム」です。私はエンティティをサブクラス化し、Xcodeは顧客向けに次のものを作成しました。

@interface Customer : NSManagedObject

@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSSet *products;
@end

@interface Customer (CoreDataGeneratedAccessors)

- (void)addProductsObject:(Products *)value;
- (void)removeProductsObject:(Products *)value;
 - (void)addProducts:(NSSet *)values;
- (void)removeProducts:(NSSet *)values;

@end

たとえば、1人の顧客(John Doe)と2つのアイテム(Widget1とWidget2)を追加するには、アクセサメソッドaddProductsObjectを次のように使用できます。

...
// Add (1) customer object
Customer *custObj = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
[custObj setValue:@"John Doe" forKey:@"name"];

// Add (2) products for John Doe
for (int foo=0; foo<2; foo++) {
    self.product = [NSEntityDescription insertNewObjectForEntityForName:@"Products" inManagedObjectContext:context];
    NSString *objString = [NSString stringWithFormat:@"Widget %d", foo];
    self.product.item = objString;
    [custObj addProductsObject:self.product];
}
...

これは問題なく機能しますが、可能であれば、 addProductsアクセサーを利用したいと思います。

生成されたアクセサーメソッドaddProductsは、次のようなオブジェクトの「セット」の挿入を容易にするためにあると想定しています。

...
NSSet *itemSet = [[NSSet alloc] initWithObjects:@"Widget 1", @"Widget 2", nil];
[custObj addProducts:itemSet];
...

しかし、これは失敗します。この試みでは、製品オブジェクトが明示的に作成されていないことを理解しているため、明示的な製品の割り当ては行われていませんが、おそらくアクセサーがそれを処理すると思いました。

したがって、 addProductsの正しい使用法は何ですか、さらに言えば、removeProductsは何ですか?

ありがとう。

4

1 に答える 1

13

addProductsに渡すセットには、ProductsではなくNSStringが含まれています。

NSMutableSet* products = [NSMutableSet set];

Products* product = [NSEntityDescription insertNewObjectForEntityForName: @"Products" inManagedObjectContext: context];
product.item = @"Widget 1";
[products addObject: product];

product = [NSEntityDescription insertNewObjectForEntityForName: @"Products" inManagedObjectContext: context];
product.item = @"Widget 2";
[products addObject: product];

[customer addProducts: products];

それ自体、アクセサーはあなたが最初にそれを与えたストリングが何のためであったかを知る方法がありません。適切な種類のエンティティを含むセットを提供する必要があります。

そうは言っても、独自のアクセサーを定義して、文字列のセットを取得し、適切に初期化されたProductsを関係に挿入することができます:addProductsWithStrings:例。

于 2012-06-13T14:39:29.743 に答える