0

私のCoreDataオブジェクトモデルには、以下に示すように3つのネストされたオブジェクトがあります。

Item
  Beverage
    Brand

アイテムのインスタンスを最初に作成したとき

Item *item = [NSEntityDescription insertNewObjectForEntityForName:@"Item" inManagedObjectContext:self.objectContext];

item.beverageプロパティはnilです。次に、item.beverage.brand.titleプロパティに値を格納します。

Beverageのインスタンスを作成してitem.beverageに割り当ててから、Brandのインスタンスを作成してitem.beverage.brandに割り当てる必要がありますか?

item.beverage = [NSEntityDescription insertNewObjectForEntityForName:@"Beverage" inManagedObjectContext:self.objectContext];

item.beverage.brand = [NSEntityDescription insertNewObjectForEntityForName:@"Brand" inManagedObjectContext:self.objectContext];

最終的にtitleプロパティに値を割り当てる前に?

item.beverage.brand.title=@"Sample Title";

これを行うためのより短い/より冗長でない方法はありますか?

4

2 に答える 2

1

オブジェクトグラフに各オブジェクトを作成する必要があります。Core-Dataが提供するショートカットを知りません。もちろん、ボイラープレートコードをたくさん書いていることに気付いた場合は、独自のメソッド、カテゴリ、またはマクロを記述して、冗長性を減らすことができます。

于 2012-08-31T21:06:26.953 に答える
0

個別のエンティティの目的が主に動作のカプセル化またはデータの正規化である場合、子を自動的に挿入せずに親を挿入したくない場合があります。あなたの場合、これは常に必ず飲み物を持っているアイテムである可能性があります。

この場合、カスケード削除ルールを使用して、ItemとBeverageの関係をオプションではなく1に設定できます。一緒に、これらは一方が他方なしでは無意味であるという事実を反映しています。残念ながら、その場合、アイテムを挿入しても飲料は挿入されません。これを行うには、オーバーライドawakeFromInsertしてこの挿入を実行します。そうすると、Itemのインスタンスが作成されるたびに自動的に表示されます。

一方、アイテムに飲料がない可能性がある場合、他の投稿者がコメントしたように、その飲料には常に名前が付いている可能性がありますItem.setBrandname。これにより、飲料を挿入するカスタムロジック-が追加される可能性もあります。まだ存在していない場合は、実行可能な解決策です。

ビジネスロジックがこの種の決定を推進します。

また、fwiw、'item'は予約語ではありませんが、抽象/プログラミング関連の概念であるため、クラス/変数名として避けるのに適した単語である可能性があります。それは私の答えの残りの部分とは完全に別です。;-)

于 2012-09-14T21:10:23.837 に答える