2014-02-15 162 views
0

我正在执行核心数据轻量级迁移,将新属性添加到现有对象。例如,假设我有歌曲和播放列表,两者之间存在多对多关系(即,歌曲可以在多个播放列表中,并且播放列表包含多首歌曲)。核心数据迁移不会持久存在新属性

我添加了一个新的核心数据模型版本,然后添加了一个名为songCount的新播放列表属性。我手动添加的属性,以我的模型类,然后推翻了CoreDataGeneratedAccessors添加新SongPlaylist像这样:

@dynamic songCount; 

- (void)addSongObject:(Song *)value 
{ 
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1]; 

    [self willChangeValueForKey:@"songs" 
       withSetMutation:NSKeyValueUnionSetMutation 
        usingObjects:changedObjects]; 
    [[self primitiveSongs] addObject:value]; 
    [self didChangeValueForKey:@"songs" 
       withSetMutation:NSKeyValueUnionSetMutation 
        usingObjects:changedObjects]; 

    // don't think the broadcasts are necessary when using the setter 
    [self willChangeValueForKey:@"songCount"]; 
    self.songCount = @([[self primitiveSongs] count]); 
    [self didChangeValueForKey:@"songCount"]; 
} 

这一切都正常工作。当我将一首歌曲添加到播放列表中,然后对播放列表进行核心数据获取时,播放列表的正确值为songCount(我甚至可以按歌曲数进行获取排序,这是整点)。

但是,当我重新启动应用程序时,我所有播放列表的songCount属性为nil。我错过了什么?我做了一个[context save],播放列表确实包含了新的歌曲,但它并没有保存歌曲数量。这不是一个瞬态属性,并且persistentStoreCoordinator不会抱怨迁移。我不确定还有什么可能会出错,或在哪里寻找调试。

+0

请勿尝试重写生成的存取器并手动添加songCount。如果它仍然存在,你的覆盖是错误的。 '[playlist addSongObject:song]; playlist.songCount = @(playlist.songCount.integerValue +1);' – Mundi

回答

0

我通过记录与歌曲和播放列表关联的托管对象上下文来发现问题。他们是不同的,所以[context save]保存新的歌曲,但不是它被添加到播放列表。核心数据通过将歌曲添加到播放列表的反向关系自动为我解决了一致性问题,但它并未自动更新songCount。不要问我为什么我的应用程序中有两个不同的托管对象上下文。

相关问题