2014-02-15 65 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。不要問我爲什麼我的應用程序中有兩個不同的託管對象上下文。

相關問題