核心数据迁移不会持久保存新属性

时间:2014-02-15 21:50:08

标签: ios core-data migration

我正在执行Core Data轻量级迁移,向现有对象添加新属性。例如,假设我有歌曲和播放列表,两者之间存在多对多关系(即歌曲可以在多个播放列表中,播放列表包含多首歌曲)。

我添加了一个新的Core Data模型版本,然后添加了一个名为songCount的新播放列表属性。我手动将该属性添加到我的模型类中,然后覆盖了CoreDataGeneratedAccessors,以便将新的Song添加到Playlist,如下所示:

@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不会抱怨迁移。我不确定还有什么可能出错,或者在哪里寻找调试。

1 个答案:

答案 0 :(得分:0)

我通过记录与歌曲和播放列表关联的托管对象上下文找到了问题。它们是不同的,所以[context save]保存了新歌,但没有保存它添加到的播放列表。 Core Data通过将歌曲添加到播放列表的反向关系,自动修复了我的一致性问题,但它没有自动更新songCount。不要问我为什么我的应用程序中有两个不同的托管对象上下文。