上記の例とは異なり、Core Data は関係グラフも維持する必要があるため、Core Data でこれを直接行うことはできません。
これを理解するために、上記のコード例を使用して関係を手動で設定するとします。との にSavedDie
保存されているクラスがあるsavedDice
とします。各インスタンスが を参照するようにしたい場合、所有者へのポインターを作成するのは簡単ですが、それがどのプロパティに格納されているかをどのように知ることができますか。さらに重要なことは、同じオブジェクトが最終的に両方のプロパティまたは 2 つ以上の個別のオブジェクトで?immediateRolls
PlayerState
SavedDie
PlayerState
PlayerState
PlayerState
SavedDie
PlayerState
Core Data は、これらすべてを自動的に管理するために作成され、エンティティ グラフを使用して管理します。エンティティはクラスではありません。代わりに、それらは主にオブジェクト間の関係の抽象的な表現です。エンティティ グラフでは、1 つのエンティティに別のエンティティとの 2 つの関係を持たせることはできません。これは、ライブ データ オブジェクトのどのインスタンスが相互に関連しているかを追跡することが不可能になるためです。
問題を解決するには 2 つの方法があります。
(1) エンティティの継承を使用する: エンティティを作成し、Die
エンティティに必要なすべての属性を設定します。SavedDie
次に、 との 2 つのサブエンティティを作成しますImmediateDie
。次に、関係を設定します。
PlayerState.savedDie<-->SavedDie.playerState
PlayerState.immediateDie<-->>ImmediateDie.playerState
(2) 取得した関係を使用する: この場合、1 つのDie
エンティティと 1 つの関係があります。
PlayerState.Die<-->>Die.playerState
...しかし、Die
各インスタンスを保存済みまたは即時にする属性があります。次に、述語がそれぞれフラグの異なる状態を検索する 2 つのフェッチされた関係を作成します。
(3) リンク エンティティを使用する: この手法では、中間エンティティを使用して、次のように複数の関係で 2 つの主要なエンティティを結び付けます。
PlayerState{
//...some attributes
savedDice<-->>PlayerToSavedDie.playerState
immediateDice<-->>PlayerToImmediateDie.playerState
}
ToDie{
die<-->SaveDie.player
}
PlayerToSavedDie:ToDie{ //...subentity of ToDie
//... no attributes
playerState<<-->PlayerState.savedDice
}
PlayerToImmediateDie:ToDie{ //...subentity of ToDie
//... no attributes
playerState<<-->PlayerState.savedDice
}
Die{
player<-->ToDie.die
}
Die
このようにして、1 つのリンク関係を削除して別のリンク関係を作成するだけで、インスタンスを関係の周りに移動できます。それに対するDie.player
ポイントは、またはその関係でToDie
どちらかを受け入れるためです。PlayerToSavedDie
PlayerToImmediateDie
これらの手法のどれを使用するかは、データ モデルのニーズによって異なります。1 つの関係にある論理 Die オブジェクトが別の関係に決してジャンプしない場合は、(1) を使用します。保存または即時データが論理 Die オブジェクト自体の重要な属性である場合は、(2) を使用します。論理 Die オブジェクトがリレーションシップ間を移動する必要があり、保存されたデータまたは即時データが論理 Die オブジェクトの一部でない場合は、(3) を使用します。
これはすべて大変な作業に思えるかもしれませんが、重要なことを 1 つ覚えておく必要があります。関係は、属性と同じように重要です。その関係が、モデルがシミュレートする現実世界のオブジェクト、イベント、または条件を反映していない場合、モデルは機能しません。人間関係について考え、管理することに時間を費やすことを期待する必要があります。
Core Data を使用すると、関係管理が 100 倍簡単になりますが、それでも多少の作業が必要です。