1

私は、メディア アイテムを記述する多くの MediaItem エンティティを含むコア データ ストアを持っています。また、多くの MediaItem と 1 対多の関係を持つ NewsItem もあります。ここまでは順調ですね。

ただし、MediaItems と 1 対多の関係を持つ PlayerItems と GalleryItems もあります。したがって、MediaItem はエンティティ間で共有されます。

多くのエンティティが 1 対多の関係を持つ可能性があることを考えると、MediaItem から、それと関係を持つエンティティのすべて (1 つ以上) への相互関係をどのように設定できますか?さらに、MediaItem を削除するルールを実装するにはどうすればよいですか?それらの相互関係の数が 0 になると?


記録のために(そしてそれが他の誰かに役立つ場合に備えて)、(最後と最後に名前が付けられた)とMediaLinkedEntity1対多の関係を持つ抽象クラスを作成することでこれを解決しました。次に、このエンティティをおよびにサブクラス化し、 に次のメソッドを実装しました。MediaItemsMediaItemsMediaLinkedEntityLinkedEntitiesMediaItemNewsItemsGalleryItems-prepareForDeletionMediaLinkedEntity

- (void)prepareForDeletion {

    NSSet *mediaItems = self.MediaItems;
    NSSet *linkedEntities;

    // step through all media items we link to
    for( MediaItem *mediaItem in mediaItems ){
        linkedEntities = mediaItem.LinkedEntities;
        if( [ linkedEntities count ] == 1 && [ linkedEntities containsObject: self ] ){
        // if this MediaLinkedEntity is the only entry in the mediaItem's linked entities list, delete it.
            [ mediaItem.managedObjectContext deleteObject: mediaItem ];
        }
    }   

    [ super prepareForDeletion ];
}

基本的に、以下のマーカスの回答に従います。

4

2 に答える 2

1

これに対する最善の答えは、一般的な方法で関係を処理する抽象的な親エンティティを用意することです。これにより、モデル内の関係の数を減らすことができます。

削除ルールに関しては、リレーションシップの「一」側のサブクラスを作成し、その-prepareForDeletionメソッドを実装して、多くの側で孤立したアイテムをチェックし、発生したときにそれらを削除する必要があります。

于 2010-06-04T17:30:33.843 に答える
0

ただし、MediaItemsと1対多の関係を持つPlayerItemsとGalleryItemsもあります。したがって、MediaItemsはエンティティ間で共有されます。

最も簡単ですが、それほど美しくはありませんが、MediaItemリレーションごとに逆リレーションシップを作成することです。

もう1つの可能性は、MediaItemに関連する抽象的な親エンティティを作成し、この一般的なエンティティからGalleryItem、NewsItems、PlayerItemを継承することです。

多くのエンティティが1対多の関係を持っている可能性がある場合、MediaItemから、MediaItemと関係のあるすべてのエンティティ(1つ以上)への相互関係を設定するにはどうすればよいですか。さらに、MediaItemを削除するルールを実装するにはどうすればよいですか。それらの相互関係の数が0に落ちたとき?

この動作を作成するには、いくつかの方法があります。KVOを使用して、MediaItemのすべての逆の関係を観察できます。

于 2010-06-04T06:48:00.683 に答える