【发布时间】:2011-05-12 19:37:42
【问题描述】:
我正在尝试通过使用带有 CoreData 的 NSFetchedResultsController 调用 mergeChangesFromContextDidSaveNotification 将addingManagedObjectContext 中的更改合并到我的主managedObjectContext 中。像这样:
- (void)addGoalViewController:(AddGoalViewController *)controller didFinishWithSave:(BOOL)save {
if (save) {
NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter];
[dnc addObserver:self
selector:@selector(addControllerContextDidSave:)
name:NSManagedObjectContextDidSaveNotification
object:addingManagedObjectContext];
NSLog(@"Before save - addingManagedObjectContext - Number of registered objects: %d", [[addingManagedObjectContext registeredObjects] count]);
NSLog(@"Before save - addingManagedObjectContext - Number of inserted objects: %d", [[addingManagedObjectContext insertedObjects] count]);
NSLog(@"Before save - addingManagedObjectContext - Number of updated objects: %d", [[addingManagedObjectContext updatedObjects] count]);
NSLog(@"Before save - addingManagedObjectContext - Number of deleted objects: %d", [[addingManagedObjectContext deletedObjects] count]);
// Save the new object to the adding managed object context
NSError *error = nil;
if ([addingManagedObjectContext hasChanges] && [addingManagedObjectContext save:&error] == NO) {
// Update to handle the error appropriately.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
}
NSLog(@"After save - addingManagedObjectContext - Number of registered objects: %d", [[addingManagedObjectContext registeredObjects] count]);
NSLog(@"After save - addingManagedObjectContext - Number of inserted objects: %d", [[addingManagedObjectContext insertedObjects] count]);
NSLog(@"After save - addingManagedObjectContext - Number of updated objects: %d", [[addingManagedObjectContext updatedObjects] count]);
NSLog(@"After save - addingManagedObjectContext - Number of deleted objects: %d", [[addingManagedObjectContext deletedObjects] count]);
// Remove the adding context observer
[dnc removeObserver:self name:NSManagedObjectContextDidSaveNotification object:addingManagedObjectContext];
}
// Reset the adding context back to its default state
[addingManagedObjectContext reset];
// Release the adding managed object context.
self.addingManagedObjectContext = nil;
// Dismiss the add goal view to return to the main list
[self dismissModalViewControllerAnimated:YES];
}
我正在关注 CoreDataBooks 示例当我尝试合并更改时,虽然它不起作用。这是我的合并代码:
- (void)addControllerContextDidSave:(NSNotification *)saveNotification {
NSManagedObjectContext* context = [fetchedResultsController managedObjectContext];
// Merging changes causes the fetched results controller to update its results
NSLog(@"Before merge - managedObjectContext - Number of registered objects: %d", [[context registeredObjects] count]);
NSLog(@"Before merge - managedObjectContext - Number of inserted objects: %d", [[context insertedObjects] count]);
NSLog(@"Before merge - managedObjectContext - Number of updated objects: %d", [[context updatedObjects] count]);
NSLog(@"Before merge - managedObjectContext - Number of deleted objects: %d", [[context deletedObjects] count]);
[context mergeChangesFromContextDidSaveNotification:saveNotification];
NSLog(@"After merge - managedObjectContext - Number of registered objects: %d", [[context registeredObjects] count]);
NSLog(@"After merge - managedObjectContext - Number of inserted objects: %d", [[context insertedObjects] count]);
NSLog(@"After merge - managedObjectContext - Number of updated objects: %d", [[context updatedObjects] count]);
NSLog(@"After merge - managedObjectContext - Number of deleted objects: %d", [[context deletedObjects] count]);
}
不幸的是,它似乎没有将对象添加到我的主要托管对象上下文中,它添加到了我的添加管理对象上下文中,但在合并之后它应该将它们合并到主要托管对象上下文中。但是,我的主托管对象上下文中的注册对象数量仍然为0。保存后看到addingManagedObjectContext中的1个注册对象了吗?那应该在我的主要 managedObjectContext 中,因为我合并了它,但事实并非如此。它反而粘在我的addingManagedObjectContext 中。
我查看了 Apple 类参考文档,从我读到的内容看来,
Before save - addingManagedObjectContext - Number of registered objects: 1
Before save - addingManagedObjectContext - Number of inserted objects: 1
Before save - addingManagedObjectContext - Number of updated objects: 1
Before save - addingManagedObjectContext - Number of deleted objects: 0
Before merge - managedObjectContext - Number of registered objects: 0
Before merge - managedObjectContext - Number of inserted objects: 0
Before merge - managedObjectContext - Number of updated objects: 0
Before merge - managedObjectContext - Number of deleted objects: 0
After merge - managedObjectContext - Number of registered objects: 0
After merge - managedObjectContext - Number of inserted objects: 0
After merge - managedObjectContext - Number of updated objects: 0
After merge - managedObjectContext - Number of deleted objects: 0
After save - addingManagedObjectContext - Number of registered objects: 1
After save - addingManagedObjectContext - Number of inserted objects: 0
After save - addingManagedObjectContext - Number of updated objects: 0
After save - addingManagedObjectContext - Number of deleted objects: 0
从这个输出可以看出,它正在将对象添加到addingManagedObjectContext,但它没有将对象合并到主managedObjectContext。相反,该对象保留在addingManagedObjectContext 中。从 Apple Class Reference 看来,这似乎不应该发生。相反,它应该将对象合并到 managedObjectContext 中。而且似乎没有任何方法可以检查 mergeChangesFromContextDidSaveNotification 是否错误。
【问题讨论】:
标签: iphone objective-c core-data nsmanagedobject nsmanagedobjectcontext