3
對於在保存PlaylistCall
之前設置的PlaylistCall
實體,我有強制genericCall
關係。日誌顯示genericCall
不是零,但在嘗試保存託管對象上下文時指出未設置關係時出現驗證錯誤。核心數據關係即使已設置也不保存
什麼會導致在保存期間已經設置的關係變爲零?
我已經驗證或嘗試:
- 我使用一個共享的單作爲整個應用程序,所以我絕對之間存在
- 反比關係相同的管理對象範圍內的工作我的管理對象上下文
GenericCall
和PlaylistCall
- 一時興起,我試圖刪除的關係,然後重新創建它,但是這並沒有因此它似乎在我的代碼中的錯誤,而不是在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;
}
}
任何想法,我可能是做錯了?這看起來很簡單,我在我的應用程序的其他地方使用了相同的方法來設置關係,所以必須有我缺少的東西。謝謝你的時間!
您對'genericCall'已經有一個非nil值的'playlistCall'的評論是做了什麼。無論出於何種原因,我在GenericCall實體上設置了「playlistCall」關係,即使它應該是一對多關係('playlistCalls'),所以我每次都會重新分配關係。感謝智慧!順便說一句,如果沒有你的核心數據手冊,我會死在水裏。它一直節省我一次又一次,所以感謝您的寫作! – iwasrobbed 2013-03-25 17:38:49
謝謝,很高興聽到它幫助! – 2013-03-25 17:39:46
我剛剛經歷了這個完全相同的問題,並且我完成了完全相同的事情(設置一對一關係而不是一對多關係)。感謝上帝StackOverflow和美好的人誰張貼答案! – user2294382 2014-10-22 22:20:59