我正在执行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不会抱怨迁移。我不确定还有什么可能出错,或者在哪里寻找调试。
答案 0 :(得分:0)
我通过记录与歌曲和播放列表关联的托管对象上下文找到了问题。它们是不同的,所以[context save]
保存了新歌,但没有保存它添加到的播放列表。 Core Data通过将歌曲添加到播放列表的反向关系,自动修复了我的一致性问题,但它没有自动更新songCount
。不要问我为什么我的应用程序中有两个不同的托管对象上下文。