我有一个NSManagedObjectContext
创建的主appDelegate
。
现在,我正在使用另一个NSManagedObjectContext
来编辑/添加新对象,而不会影响主NSManagedObjectContext
,直到我保存它们为止。
当我保存第二个NSManagedObjectContext
时,更改不会反映在主NSManagedObjectContext
中,但如果我从模拟器打开.sqlite数据库,则更改已正确保存到.sqlite数据库中。如果我再次获取数据无关紧要,或者即使我创建了第三个NSManagedObjectContext
,我也无法从第二个NSManagedObjectContext
看到这些更改,尽管这些更改确实存在于磁盘上这一点。
如果我退出并重新打开该应用,则所有更改都会存在。
什么可能导致主NSManagedObjectContext
看不到持久存储中出现的新更改?
在此方法之前,我使用了一个NSManagedObjectContext
和undoManager
,但我想将其更改为使用两个不同的NSManagedObjectContext
。
第二个NSManagedObjectContext
保存:
NSError* error = nil;
if ([managedObjectContext hasChanges]) {
NSLog(@"This new object has changes");
}
if (![managedObjectContext save:&error]) {
NSLog(@"Failed to save to data store: %@", [error localizedDescription]);
NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
if(detailedErrors != nil && [detailedErrors count] > 0) {
for(NSError* detailedError in detailedErrors) {
NSLog(@" DetailedError: %@", [detailedError userInfo]);
}
}
else {
NSLog(@" %@", [error userInfo]);
}
}
答案 0 :(得分:27)
如果您还没有这样做,我建议您阅读Core Data : Change Management.
上的Apple文档您需要通知第二个上下文中保存的更改的第一个上下文。保存上下文时,它会发布NSManagedObjectContextDidSaveNotification
。注册该通知。在处理程序方法中,将通过第二个上下文保存的更改合并到第一个上下文中。例如:
// second managed object context save
// register for the notification
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(handleDidSaveNotification:)
name:NSManagedObjectContextDidSaveNotification
object:secondManagedObjectContext];
// rest of the code ommitted for clarity
if (![secondManagedObjectContext save:&error]) {
// ...
}
// unregister from notification
[[NSNotificationCenter defaultCenter]
removeObserver:self
name:NSManagedObjectContextDidSaveNotification
object:secondManagedObjectContext];
通知处理程序:
- (void)handleDidSaveNotification:(NSNotification *)note {
[firstManagedObjectContext mergeChangesFromContextDidSaveNotification:note];
}