1

我有一个核心数据存储,其中包含许多描述媒体项目的 MediaItem 实体。我也有 NewsItems,它与许多 MediaItems 具有一对多的关系。到现在为止还挺好。

但是,我也有 PlayerItems 和 GalleryItems,它们也与 MediaItems 具有一对多的关系。所以 MediaItems 是跨实体共享的。

鉴于许多实体可能具有一对多关系,我如何设置从 MediaItem 到与其有关系的所有(1 个或多个)实体的互惠关系,此外,我如何实施删除 MediaItem 的规则当这些互惠关系的数量下降到0?


作为记录(如果它对其他人有用),我通过创建一个与(在末尾和末尾命名)MediaLinkedEntity具有一对多关系的抽象类来解决这个问题。然后我将此实体子类化为and并在中实现以下方法: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

但是,我也有 PlayerItems 和 GalleryItems,它们也与 MediaItems 具有一对多的关系。所以 MediaItems 是跨实体共享的。

最简单但不那么漂亮的方法是为每个 MediaItem 关系创建反向关系。

另一种可能性是创建一个与 MediaItem 有关系的抽象父实体,并从这个通用实体继承 GalleryItem、NewsItems、PlayerItem。

鉴于许多实体可能具有一对多关系,我如何设置从 MediaItem 到与其有关系的所有(1 个或多个)实体的互惠关系,此外,我如何实施删除 MediaItem 的规则当这些互惠关系的数量下降到0?

有几种方法可以创建这种行为。您可以使用 KVO 来观察 MediaItem 的所有反向关系

于 2010-06-04T06:48:00.683 回答