MagicalRecord和CoreData在不同的上下文中保存错误
问题描述:
所以我有一些方法可以使用MagicalRecord将我的设置保存在CoreData中。但后来我试图做到这一点,我得到这个错误:Illegal attempt to establish a relationship 'settings' between objects in different contexts
MagicalRecord和CoreData在不同的上下文中保存错误
因此,这里是我的代码: 此方法由特定的用户保存数据,谁在使用PROGRAMM现在
-(void)saveSettingsFirst:(BOOL)first{
[MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext){
SettingsData *newData = [self settingsDataForCurrentUserInContext:localContext];
//SettingsData *newData = [SettingsData MR_createEntityInContext:localContext];
newData.firstValue = @(first);
NSLog(first ? @"saveSettings FIRST 0" : @"saveSettings FIRST 1");
newData.settings = [[CacheManager shared] currentUserWithContext:localContext];
NSLog(@"Settings one is saved");
}];
}
这种方法采取从CoreData的currentUser设置:
-(SettingsData*)settingsDataForCurrentUserInContext:(NSManagedObjectContext*)context{
NSLog(@"In settingsDataForCurrentUserInContext");
SettingsData *settings = [SettingsData MR_findFirstByAttribute:@"settings" withValue:[[CacheManager shared] currentUserWithContext:context]];
return settings;
}
最后的方法,谁从CoreData获取用户数据为当前用户:
-(UserData*)currentUserWithContext:(NSManagedObjectContext*)context{
UserData *persons = [UserData MR_findFirstInContext:context];
if (persons!=nil) {
NSLog(@"Current user with context not nil value");
}
return persons;
}
我需要帮助来认识是我的错误,因为对我来说这似乎是逻辑。
答
您在使用SettingsData
时正在使用默认上下文。因此,更改:
SettingsData *settings = [SettingsData MR_findFirstByAttribute:@"settings" withValue:[[CacheManager shared] currentUserWithContext:context]];
到:
SettingsData *settings = [SettingsData MR_findFirstByAttribute:@"settings" withValue:[[CacheManager shared] currentUserWithContext:context] inContext: context];
(免责声明:在浏览器中输入的,而不是错字的测试)
欧凯,它的作品!谢谢! 你可以解释或给出链接阅读为什么这个工程。因为我已经使用上下文加载用户并成功加载。但正如我所看到的,我们需要在相同的环境下进行搜索,对吧? –
是的,总是使用相同的上下文。如果您检查MR码,您会看到我们的原始线路使用默认上下文。但是你传递了一个本地上下文,所以你应该调整。 – Koen
另请参阅此处:https://github.com/magicalpanda/MagicalRecord/wiki/Fetching-Entities#finding-entities-in-a-specific-context – Koen