Я борюсь с каким-то странным поведением в Core Data.У меня довольно стандартная настройка, используя пример CoreDataBook: у меня есть RootView, который использует NSFetchedResultsController для отображения списка элементов.Предмет имеет несколько атрибутов и связей с другими сущностями.У меня есть DetailView, который я использую для создания нового элемента, а также для редактирования существующего элемента, который я представляю модально.В DetailView: viewDidLoad я создаю новый managedObjectContext, в котором я хочу внести все изменения ... если пользователь нажимает Сохранить, я сохраняю этот контекст и объединяю изменения обратно;в противном случае, если пользователь нажимает кнопку отмены, все эти изменения просто исчезают.
Эта часть «добавить новый элемент» работает нормально, но когда я выбираю строку, чтобы вызвать тот же DetailView, что и существующий элемент, одно из отношений (что хорошо отображается в RootView в отладчике)внезапно становится равным нулю, когда он представлен в DetailView.Вот код для отображения DetailView в didSelectRowAtIndexPath UITableView:
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 нет ничего необычного, что могло бы вызвать это.На самом деле, у него даже нет шансов действительно нанести какой-либо ущерб ... как только он начнется, отношение существующихItem.title уже равно нулю.[istingItem - это сохраненное свойство DetailView]
Есть идеи, с чего мне начать изучать это?Последние несколько часов это сводило меня с ума.Вот некоторый код в DetailView viewDidLoad, но отношение равно nil даже до его вызова:
// 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;
В сохранении:метод, я сохраняю 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 отлично работает для нового элемента, но когда этоЭлемент устанавливается на существующиеItem и загружается снова, self.existingItem.title равен нулю.И он равен нулю с того момента, когда он представлен в контроллере представления (хотя он и не равен нулю до того, как будет представлен).Таким образом, в основном контексте, он загружает Item и его заголовок в порядке, но затем заголовок внезапно исчезает, когда он представлен в presentModalViewController: navController.
Действительно странно.Если кто-то может пролить свет на это, это будет очень ценно.
Обновление: еще одна вещь, которую стоит упомянуть, это то, что заголовок определенно сохраняется в persistentStore.Каждый раз, когда я закрываю и перезагружаю приложение, RootView показывает установленное отношение заголовка.Как только я выбираю строку, отношение становится нулевым.