(とりわけ)WorkingPlanとPositionを含むCoreDataデータベースがあります。WorkingPlanには0個以上のPositionオブジェクトがあります。同じポジションを1つのWorkingPlanに複数回追加しようとするまで、すべてが正常に機能します。(私が必要とするように)複数の関係を持つ代わりに、私は1つの関係しか得られません。その位置に複数の関係を取得するにはどうすればよいですか?
2 に答える
コメントですでに述べたように、Core Dataリレーションシップは、1つのオブジェクトと一連の別個の他のオブジェクトとのリレーションを記述します。1つのオブジェクトが同じ他のオブジェクトに対して複数の関係を持つことはできません。
私の頭に浮かぶ考えられる解決策の1つは、とWorkingStep
の間に別のエンティティを導入することです。WorkingPlan
Position
steps
からへの順序付けられた多くの関係です、WorkingPlan
WorkingStep
plan
は逆の1つの関係です。position
WorkingStep
からへの1対1の関係ですPosition
。steps
は逆対多の関係です。
1つの計画のステップは定義された順序で実行する必要があると想定しているため、からへの順序付きの関係を提案しました。WorkingPlan
WorkingStep
たとえば、プランに対して「pos1」、「pos2」、「pos1」の位置をこの順序で実行する必要がある場合は、プランに「step1」、「step2」、「step3」の3つのステップを追加します。 「step1」と「step3」は「pos1」に関連し、「step2」は「pos2」に関連しています。
順序付けられた関係に値を追加するのは少し注意が必要です。次のコードは、上記のオブジェクトを作成する方法を示しています。
WorkingPlan *plan1 = [NSEntityDescription insertNewObjectForEntityForName:@"WorkingPlan" inManagedObjectContext:context];
WorkingStep *step1 = [NSEntityDescription insertNewObjectForEntityForName:@"WorkingStep" inManagedObjectContext:context];
WorkingStep *step2 = [NSEntityDescription insertNewObjectForEntityForName:@"WorkingStep" inManagedObjectContext:context];
WorkingStep *step3 = [NSEntityDescription insertNewObjectForEntityForName:@"WorkingStep" inManagedObjectContext:context];
Position *pos1 = [NSEntityDescription insertNewObjectForEntityForName:@"Position" inManagedObjectContext:context];
Position *pos2 = [NSEntityDescription insertNewObjectForEntityForName:@"Position" inManagedObjectContext:context];
step1.position = pos1;
step2.position = pos2;
step3.position = pos1;
// temporary proxy object used to modify the ordered to-many relationship "steps":
NSMutableOrderedSet *tmpMutableSteps = [plan1 mutableOrderedSetValueForKey:@"steps"];
[tmpMutableSteps addObject:step1];
[tmpMutableSteps addObject:step2];
[tmpMutableSteps addObject:step3];
詳しくは:
plan1.steps
次のように、1つの「ステップ」で設定することもできます。
plan1.steps = [NSOrderedSet orderedSetWithObjects:step1, step2, step3, nil]; // works!
ただし、一部のアクセサメソッドは順序付けられた関係では機能しません。
[plan1 addStepsObject:step1]; // does not work!
「論理的なステップ」のようですが、:をスローしNSInvalidArgumentException
ます。
*** -[NSSet intersectsSet:]: set argument is not an NSSet
これは、他の人がすでに気付いている自動生成されたアクセサメソッドのバグのようです(たとえば、NSOrderedSetで生成されたアクセサで例外がスローされます)。プロキシオブジェクトを使用することは、その問題の回避策です。
xCode Core Dataモデルで、WorkingPlanに関係「positions」を追加します。作業計画オブジェクトを選択したまま、「位置」関係を選択した状態で、データモデルインスペクター(xCodeの右側)の関係プロパティフォームで、「複数」の「To-ManyRelationship」チェックボックスを選択します。workingPlanに関連する正確な数のポジションが必要な場合は、必要に応じて最小/最大カウントフィールドに入力します。