【发布时间】:2011-07-31 07:23:15
【问题描述】:
我正在为 Core Data 中的一些奇怪行为而苦苦挣扎。我有一个相当标准的设置,使用 CoreDataBook 示例:我有一个 RootView,它使用 NSFetchedResultsController 来显示项目列表。项目有一些属性和与其他实体的关系。我有一个 DetailView,我用它来创建一个新项目,以及编辑一个现有的项目,我以模态方式呈现。在 DetailView: viewDidLoad 中,我创建了一个新的 managedObjectContext,我想在其中进行所有更改……如果用户按下保存,我保存此上下文并将更改合并回来;否则,如果用户按下取消,所有这些更改都会消失。
“添加新项目”部分工作正常,但是当我选择行以显示与现有项目相同的 DetailView 时,其中一个关系(在调试器的 RootView 中显示良好)突然变为 nil当它出现在 DetailView 中时。这是在 UITableView 的 didSelectRowAtIndexPath 中显示 DetailView 的代码:
Item *managedObject = (Item *)[self.fetchedResultsController objectAtIndexPath:indexPath];
DetailView *childController = [[DetailView alloc] initWithNibName:@"DetailView" bundle:nil];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:childController];
childController.existingItem = managedObject;
// ** Item's relationship to Title is not nil at this point
[self presentModalViewController:navController animated:YES];
// ** Item's relationship Title is now nil
[childController release];
[navController release];
在 DetailView 控制器中没有什么特别的东西会导致这种情况。事实上,它甚至没有机会真正对它造成任何伤害……一旦开始,existingItem.title 关系就已经为零。 [existingItem 是 DetailView 的保留属性]
知道我应该从哪里开始研究这个吗?在过去的几个小时里,它一直让我发疯。这是 DetailView viewDidLoad 中的一些代码,但在调用之前关系为零:
// Create a new managed object context
NSManagedObjectContext *addingContext = [[NSManagedObjectContext alloc] init];
self.addEditContext = addingContext;
[addingContext release];
[self.addEditContext setPersistentStoreCoordinator:[[appDelegate managedObjectContext] persistentStoreCoordinator]];
if (!self.existingItem) {
self.existingItem = [NSEntityDescription insertNewObjectForEntityForName:@"Item" inManagedObjectContext: self.addEditContext];
}else{
self.existingItem = (Item *)[self.addEditContext objectWithID:[self.existingItem objectID]];
}
标题关系是通过从一些列表中选择来设置的:
self.existingItem.title = selectedTitle;
在 save: 方法中,我保存 addEditContext 并将更改与 appdelegate 上下文合并:
NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter];
[dnc addObserver:self selector:@selector(addControllerContextDidSave:) name:NSManagedObjectContextDidSaveNotification object: self.addEditContext];
// Save the context.
NSError *error = nil;
if (![self.addEditContext save:&error]){
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
[dnc removeObserver:self name:NSManagedObjectContextDidSaveNotification object:self.addEditContext];
self.addEditContext = nil;
在addControllerContextDidSave中:
- (void)addControllerContextDidSave:(NSNotification*)saveNotification {
id appDelegate = [[UIApplication sharedApplication] delegate];
// Merging changes causes the fetched results controller to update its results
[[appDelegate managedObjectContext] mergeChangesFromContextDidSaveNotification:saveNotification];
}
所以 save: stuff 对新项目工作正常,但是当该项目设置为 existingItem 并再次加载时,self.existingItem.title 为 nil。从它在视图控制器中呈现的角度来看,它是 nil (即使它在呈现之前不是 nil )。所以在主上下文中,它加载了Item并且它的标题关系很好,但是当它出现在presentModalViewController:navController中时,标题突然消失了。
真的很奇怪。如果有人能对此有所了解,将不胜感激。
更新:还有一点要提的是,标题肯定是持久化的。每次我关闭并重新加载应用程序时,RootView 都会显示正在设置的标题关系。一旦我选择了行,关系就变为零了。
【问题讨论】:
标签: core-data nsmanagedobjectcontext