2013-03-25 62 views
3

對於在保存PlaylistCall之前設置的PlaylistCall實體,我有強制genericCall關係。日誌顯示genericCall不是零,但在嘗試保存託管對象上下文時指出未設置關係時出現驗證錯誤。核心數據關係即使已設置也不保存

什麼會導致在保存期間已經設置的關係變爲零?

我已經驗證或嘗試:

  • 我使用一個共享的單作爲整個應用程序,所以我絕對之間存在
  • 反比關係相同的管理對象範圍內的工作我的管理對象上下文GenericCallPlaylistCall
  • 一時興起,我試圖刪除的關係,然後重新創建它,但是這並沒有因此它似乎在我的代碼中的錯誤,而不是在Xcode的隨機錯誤
  • 我試着使用setValue:forKey而不是動態屬性訪問器(點號),沒有變化

下面是日誌:

2013-03-25 11:48:35.400 Project[30599:c07] Supposed to add <PlaylistCall: 0xa1be450> (entity: PlaylistCall; id: 0xa17dea0 <x-coredata:///PlaylistCall/tBB209BC5-EF9A-4DAE-9A55-0001B97499392> ; data: { 
    delaySetting = 0; 
    genericCall = "0xd4ad520 <x-coredata://7EB1AFB2-7B49-431E-9700-275307B4D1C1/GenericCall/p367>"; 
    orderInTable = 4; 
    playlist = nil; 
    repeatSetting = 0; 
    repeatType = 0; 
    volumeSetting = 100; 
}) with generic call <GenericCall: 0xd4c3fd0> (entity: GenericCall; id: 0xd4ad520 <x-coredata://7EB1AFB2-7B49-431E-9700-275307B4D1C1/GenericCall/p367> ; data: { 
    animalCategory = "0xc0aaa80 <x-coredata://7EB1AFB2-7B49-431E-9700-275307B4D1C1/AnimalCategory/p19>"; 
    callDescription = "Call Name"; 
    numberOfTimesOnPlaylist = 0; 
    numberOfTimesPlayed = 0; 
    playlistCall = "0xa17dea0 <x-coredata:///PlaylistCall/tBB209BC5-EF9A-4DAE-9A55-0001B97499392>"; 
    soundFile = "sound_file_name"; 
    timeLength = "0.21"; 
}) 
2013-03-25 11:48:35.402 Project[30599:c07] Error saving. Reason(s): 
    PlaylistCall: The attribute 'genericCall' cannot be empty. 

這裏是我如何設置和保存的值:

GenericCall *genericCall = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
PlaylistCall *playlistCall = (PlaylistCall *)[NSEntityDescription insertNewObjectForEntityForName:@"PlaylistCall" inManagedObjectContext:commonContext.managedObjectContext]; 
[self.playlist addPlaylistCall:playlistCall withGenericCall:genericCall orderInTable:[self.playlist.playlistCalls count]]; 
// Note: all other attributes are setup via model defaults 
[commonContext save]; 

我的NSManagedObject子類爲Playlist其中我設置關係:

- (void)addPlaylistCall:(PlaylistCall *)playlistCall withGenericCall:(GenericCall *)genericCall orderInTable:(int)orderInTable 
{ 
    NSMutableOrderedSet *tempSet = [NSMutableOrderedSet orderedSetWithOrderedSet:self.playlistCalls]; 
    playlistCall.genericCall = genericCall; 
    playlistCall.orderInTable = [NSNumber numberWithInt:orderInTable]; 
    NSLog(@"Supposed to add %@ with generic call %@", playlistCall, playlistCall.genericCall); 
    [tempSet addObject:playlistCall]; 
    self.playlistCalls = tempSet; 
} 

我共同管理的對象上下文單(CommonContext)看起來就像這樣(是的,我驗證過self.managedObjectContext不是零,並且不改變):

// Saves the managed object context 
- (BOOL)save 
{ 
    NSError *anError; 
    if ([self.managedObjectContext hasChanges] && ![self.managedObjectContext save:&anError]){ 
     [self handleSaveError:anError]; 
     return NO; 
    } else { 
     return YES; 
    } 
} 

任何想法,我可能是做錯了?這看起來很簡單,我在我的應用程序的其他地方使用了相同的方法來設置關係,所以必須有我缺少的東西。謝謝你的時間!

回答

4

很難肯定,但這裏有適合症狀的情景:

  1. 您創建一個新的PlaylistCall前一個現有GenericCall實例。但是這GenericCall已經有一個非nilplaylistCall
  2. 您使用新的PlaylistCall轉讓playlistCall.genericCall = genericCall
  3. 已存在的PlaylistCall實例將其genericCall關係設置爲nil - 因爲這是一對一關係,在這種情況下這是默認行爲。
  4. 保存失敗 - 不是因爲您創建的新的PlaylistCall,這很好,而是因爲之前的PlaylistCall已與genericCall關係懸而未決。

如果這是發生了什麼,你需要檢查現有playlistCall和保存changes--最有可能要麼重新分配其genericCall之前做一些合理的與它指向別的東西,或可能只是刪除實例。

+0

您對'genericCall'已經有一個非nil值的'playlistCall'的評論是做了什麼。無論出於何種原因,我在GenericCall實體上設置了「playlistCall」關係,即使它應該是一對多關係('playlistCalls'),所以我每次都會重新分配關係。感謝智慧!順便說一句,如果沒有你的核心數據手冊,我會死在水裏。它一直節省我一次又一次,所以感謝您的寫作! – iwasrobbed 2013-03-25 17:38:49

+0

謝謝,很高興聽到它幫助! – 2013-03-25 17:39:46

+0

我剛剛經歷了這個完全相同的問題,並且我完成了完全相同的事情(設置一對一關係而不是一對多關係)。感謝上帝StackOverflow和美好的人誰張貼答案! – user2294382 2014-10-22 22:20:59