核心数据关系删除规则 - Nullify + Cascade

ede*_*y05 5 core-data ios5

实体:

  • 视频
  • 播放列表项目
  • 播放列表

关系:

  • 视频对于播放列表项是可选的,并且删除规则是无效的
  • 播放列表是至少一个播放列表项目的多个,并且删除规则是无效的
  • 视频中需要播放列表项目,并且删除规则无效
  • 对于播放列表,播放列表项是必需的 - 并且删除规则是无效的

在播放列表实体中,我没有公开playlistItem关系/集.相反,我有一个名为"视频"的瞬态未定义属性,它是通过对播放列表项集进行排序而生成的视频实体数组.播放列表和视频实体之间没有关系.

我在托管对象上下文中保存修改后的播放列表实例时遇到问题.

从playlist.m(NSManagedObject子类):

- (BOOL)validatePlaylistItems:(NSSet **)playlistItems error:(NSError **)outError
{
    NSArray *currentVideos = [self videos];
    NSArray *persistedVideos = [self videosFromPlaylistItems];

    if ([currentVideos isEqual:persistedVideos]) {
        return YES;
    }

    NSManagedObjectContext *context = [self managedObjectContext];
    for (FHPlaylistItem *pi in *playlistItems) {
        [context deleteObject:pi];
    }

    NSArray *videos = [self primitiveVideos];
    NSUInteger count = [videos count];
    for (int i = 0; i < count; i++) {
        FHPlaylistItem *pi = [FHPlaylistItem playlistItemWithVideo:[videos objectAtIndex:i]
                                                          forIndex:i
                                    insertIntoManagedObjectContext:[self managedObjectContext]];
        [self addPlaylistItemsObject:pi];
        [pi setPlaylist:self];
    }

    return YES;
}
Run Code Online (Sandbox Code Playgroud)

我想在这里完成的只是在MOC需要保存时更新播放列表项的集合,因为你可以看到操作很昂贵 - O(N*2).在第一次运行应用程序时,MOC保存得很好.但是,随后对视频属性的更改会导致Core Data产生大量错误:

Core Data: annotation: repairing missing delete propagation for to-many relationship playlistItems on object <FHPlaylist: 0x6c27eb0> (entity: Playlist; id: 0x6c26d40 <x-coredata://BCB69D8E-8393-4A2A-AF5D-0AA1872CE2B4/Playlist/p19> ; data: {
    accountID = 0;
    lastFetched = "2012-03-31 20:05:08 +0000";
    name = Featured;
    playlistID = 1441335931001;
    playlistItems =     (
        "0x6c34be0 <x-coredata:///PlaylistItem/t9EAFBC87-5E16-4053-984F-881CCD9C1F0B2>",
        "0x6c34320 <x-coredata://BCB69D8E-8393-4A2A-AF5D-0AA1872CE2B4/PlaylistItem/p16>",
        "0x6c310c0 <x-coredata:///PlaylistItem/t9EAFBC87-5E16-4053-984F-881CCD9C1F0B3>",
        "0x6c35570 <x-coredata:///PlaylistItem/t9EAFBC87-5E16-4053-984F-881CCD9C1F0B5>",
        "0x6c34ca0 <x-coredata:///PlaylistItem/t9EAFBC87-5E16-4053-984F-881CCD9C1F0B6>",
        "0x6c34310 <x-coredata://BCB69D8E-8393-4A2A-AF5D-0AA1872CE2B4/PlaylistItem/p8>",
        "0x6c28a90 <x-coredata:///PlaylistItem/t9EAFBC87-5E16-4053-984F-881CCD9C1F0B4>",
        "0x6c34350 <x-coredata://BCB69D8E-8393-4A2A-AF5D-0AA1872CE2B4/PlaylistItem/p29>",
        "0x6c34220 <x-coredata://BCB69D8E-8393-4A2A-AF5D-0AA1872CE2B4/PlaylistItem/p2>",
        "0x6c34330 <x-coredata://BCB69D8E-8393-4A2A-AF5D-0AA1872CE2B4/PlaylistItem/p20>",
        "(...and 1 more...)"
    );
    playlistType = 0;
    referenceID = OKFFeaturedPlaylist;
    shortDescrip = "This is so descriptive! OMG!";
    thumbnailURL = nil;
    videos = "(...not nil..)";
}) with bad fault 0x6c34320 <x-coredata://BCB69D8E-8393-4A2A-AF5D-0AA1872CE2B4/PlaylistItem/p16>
Core Data: annotation: repairing missing delete propagation for to-many relationship playlistItems on object <FHPlaylist: 0x6c27eb0> (entity: Playlist; id: 0x6c26d40 <x-coredata://BCB69D8E-8393-4A2A-AF5D-0AA1872CE2B4/Playlist/p19> ; data: {
    accountID = 0;
    lastFetched = "2012-03-31 20:05:08 +0000";
    name = Featured;
    playlistID = 1441335931001;
    playlistItems =     (
        "0x6c34be0 <x-coredata:///PlaylistItem/t9EAFBC87-5E16-4053-984F-881CCD9C1F0B2>",
        "0x6c310c0 <x-coredata:///PlaylistItem/t9EAFBC87-5E16-4053-984F-881CCD9C1F0B3>",
        "0x6c35570 <x-coredata:///PlaylistItem/t9EAFBC87-5E16-4053-984F-881CCD9C1F0B5>",
        "0x6c34ca0 <x-coredata:///PlaylistItem/t9EAFBC87-5E16-4053-984F-881CCD9C1F0B6>",
        "0x6c34310 <x-coredata://BCB69D8E-8393-4A2A-AF5D-0AA1872CE2B4/PlaylistItem/p8>",
        "0x6c28a90 <x-coredata:///PlaylistItem/t9EAFBC87-5E16-4053-984F-881CCD9C1F0B4>",
        "0x6c34350 <x-coredata://BCB69D8E-8393-4A2A-AF5D-0AA1872CE2B4/PlaylistItem/p29>",
        "0x6c34220 <x-coredata://BCB69D8E-8393-4A2A-AF5D-0AA1872CE2B4/PlaylistItem/p2>",
        "0x6c34330 <x-coredata://BCB69D8E-8393-4A2A-AF5D-0AA1872CE2B4/PlaylistItem/p20>",
        "0x6c34340 <x-coredata://BCB69D8E-8393-4A2A-AF5D-0AA1872CE2B4/PlaylistItem/p27>"
    );
    playlistType = 0;
    referenceID = OKFFeaturedPlaylist;
    shortDescrip = "This is so descriptive! OMG!";
    thumbnailURL = nil;
    videos = "(...not nil..)";
}) with bad fault 0x6c34310 <x-coredata://BCB69D8E-8393-4A2A-AF5D-0AA1872CE2B4/PlaylistItem/p8>
Etc. Etc. Etc.
Run Code Online (Sandbox Code Playgroud)

这似乎是删除规则的问题所在.投诉是"缺少删除传播",因此似乎无效是错误的选择.但是,为什么这是错的?这对我来说没有意义.Apple的核心数据编程指南中的级联删除规则的措辞使我看起来如果我将播放列表项的删除规则设置为级联,我将删除视频和播放列表对象.

级联 - 删除关系目标处的对象

此外,如果我在快速枚举循环中将播放列表项与视频和播放列表之间的关系设置为nil,则Core Data不会抱怨必须修复丢失的删除传播.

for (FHPlaylistItem *pi in *playlistItems) {
    [pi setVideo:nil];
    [pi setPlaylist:nil];
    [context deleteObject:pi];
}
Run Code Online (Sandbox Code Playgroud)

编辑:没有,手动关系没有在所有情况下都无法正常工作.(也许不出意外?)

sve*_*ena 10

在删除块之后尝试[[self managedObjectContext] processPendingChanges]将为您解决奇怪的消息.

当您在同一个运行循环周期中改变托管对象上下文并且某些涉及的对象与已删除对象有关系时,似乎Core Data会在某些情况下变得混乱.

问候,

斯文.


Wie*_*nke 0

在 Playlist 实体上,我没有公开 playlistItem 关系/集。相反,我有一个名为“视频”的瞬态未定义属性,它是通过对播放列表项集进行排序而生成的视频数组。

也许这就是问题所在。目前尚不清楚您如何将这种关系命名为Video。如果关系和瞬态属性都被命名,那么videos肯定会遇到问题。除了(而不是代替)(例如,瞬态数组)的声明之外,为什么不在'sh 文件videos中正常声明关系。PlaylistvideosSorted

另外,请确保模型中清楚哪些关系是互逆的。