0

Xcode 4.3.2 の Core Data では、Ordered To-Many 関係は でモデル化されていNSOrderedSetます。関係にアイテムを繰り返す必要があることがわかるまでは、うまく機能します。でモデル化する必要がありますNSArray

たとえば、音楽アプリには次のような曲がありますSongA, SongB, SongC

人々が好きな順序で曲を挿入し、繰り返すことができるパーティー プレイ リストが必要な場合があります。リストは次のようになります。

[SongC, SongC, SongA, SongC]

Core Data が現在機能している方法では、リストは次のようになります。

[SongC, SongA]

つまり、セットでモデル化されているため、繰り返されるアイテムはすべて削除されます。

それでは、私の質問に戻りましょう: Core Data のリレーションシップで繰り返されるアイテムを順番にモデル化する良い方法は何ですか?

4

2 に答える 2

2

リレーションシップはセットです (順序付きリレーションシップは順序付きセットですが、セットのままです)。定義上、セットには一意のオブジェクトが含まれます。したがって、どちらの方法でも、重複するオブジェクトを関係に入れることはできません。

順序付けられた関係機能を使用するかどうかに関係なく、抽象的な ER モデルに戻って、概念的な関係をコア データ モデルに変換する別の方法を見つける必要があります。単純な SQL (または SQL に似た) データベースでそれを実行してから、Core Data が SQL を超えて実行していることに戻ります。

iTunes のプレイリストに似たものを作っているようですね。そのために機能する可能性のあるモデルは次のようになります。

 Playlist      <--->> PlaylistEntry
 PlaylistEntry <<---> Song

エンティティは、エンティティが 1 つに含まれる 1PlaylistEntryつのインスタンスを表します。単一の で同じを参照する複数の を使用できます。他の属性を に追加して、他のことを追跡できます (順序付けられた関係を使用していない場合は、曲の順序など)。おまけとして、必要に応じてこれを使用して他の機能を追加できます。たとえば、1 つの長いトラックから 3 つの異なるスニペットを再生するプレイリストを作成できます。SongPlaylistPlaylistEntrySongPlaylistPlaylistEntry

于 2012-06-10T05:42:03.143 に答える
1

rickster が言ったように、Core Data によって管理される関係は、それらの間のエンティティを一意に関連付けます。Lion の Core Data が順序付けられた関係をサポートしている (と想定されている) 場合でも (実際には機能しないため、機能にバグがあり、ほとんど使用できないため)、それらは依然としてリレーショナル データベース モデルに従う関係です。

したがって、アソシエーションを自分で管理する必要があり、アソシエーションの順序付けされた部分も自分で管理する必要があります。

Score <->> ScoreSong
ScoreSong <<-> Song

ScoreSong には次のプロパティがあります。

ScoreSong:
- score: -> Score
- song: -> Song
- order: integer, indexed

次に、キー順序のソート記述子を指定して Fetch Request を使用する必要があります。これにより、ScoreSong の順序付けられた NSArray が返されます。fetch リクエストで曲をプリフェッチするように要求できます。次に、valueForKey: @"song" を 1 回呼び出すだけで、適切に順序付けされたまま、songs 配列を作成できます。

もちろん、スコアに複数の曲を含める必要がある場合は、1 つのソングに対して異なる ScoreSong を作成する必要があります。それが追加された間接化の要点です。

于 2012-06-11T07:43:31.307 に答える