我正在执行核心数据轻量级迁移,将新属性添加到现有对象。例如,假设我有歌曲和播放列表,两者之间存在多对多关系(即,歌曲可以在多个播放列表中,并且播放列表包含多首歌曲)。核心数据迁移不会持久存在新属性
我添加了一个新的核心数据模型版本,然后添加了一个名为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不会抱怨迁移。我不确定还有什么可能会出错,或在哪里寻找调试。
请勿尝试重写生成的存取器并手动添加songCount。如果它仍然存在,你的覆盖是错误的。 '[playlist addSongObject:song]; playlist.songCount = @(playlist.songCount.integerValue +1);' – Mundi