Iphone 通过多个传入的一对多关系维护核心数据实体的完整性

Iphone 通过多个传入的一对多关系维护核心数据实体的完整性,iphone,database-design,core-data,one-to-many,data-integrity,Iphone,Database Design,Core Data,One To Many,Data Integrity,我有一个核心数据存储,其中包含许多描述媒体项的MediaItem实体。我还有新闻项目,它与许多媒体项目有一对多的关系。到目前为止还不错 然而,我也有PlayerItems和GalleryItems,它们与MediaItems也有一对多的关系。因此,MediaItems是跨实体共享的 鉴于许多实体可能具有一对多关系,我如何设置从一个MediaItem到所有(1个或多个)与其有关系的实体的互惠关系,而且,当这些互惠关系的数量降至0时,我如何实现删除MediaItem的规则 对于记录(如果它对其他人

我有一个核心数据存储,其中包含许多描述媒体项的MediaItem实体。我还有新闻项目,它与许多媒体项目有一对多的关系。到目前为止还不错

然而,我也有PlayerItems和GalleryItems,它们与MediaItems也有一对多的关系。因此,MediaItems是跨实体共享的

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


对于记录(如果它对其他人有用),我通过创建一个抽象的
MediaLinkedEntity
类来解决这个问题,该类与
MediaItems
具有一对多关系(在
MediaLinkedEntity
结尾命名为
MediaItems
,在
MediaItem
结尾命名为
LinkedEntity
)。然后,我将该实体子类化为
新闻项
GalleryItems
,并在
MediaLinkedEntity
中实现了以下
-PrepareOrderItem
方法:

- (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 ];
}
基本上,按照马库斯下面的回答

然而,我也有PlayerItems和GalleryItems,它们与MediaItems也有一对多的关系。因此,MediaItems是跨实体共享的

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

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

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

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

然而,我也有PlayerItems和GalleryItems,它们与MediaItems也有一对多的关系。因此,MediaItems是跨实体共享的

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

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

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

有几种方法可以创建这种行为。
您可以使用KVO观察MediaItem的所有反向关系,最好的答案是使用一个抽象的父实体,以通用的方式处理关系。这将允许您减少模型中的关系数


至于delete规则,您应该为“one”创建一个子类并实现它们的
-preparefordelection
方法来检查多个方面的孤立项,然后在出现孤立项时将其删除。

最好的解决方法是使用一个抽象的父实体以通用方式处理关系。这将允许您减少模型中的关系数

至于删除规则,您应该为关系的“一”侧创建一个子类,并实现它们的
-preparefordelection
方法来检查多侧的孤立项,然后在发生时删除它们