Я думаю, что потерял свой контекст управляемого объекта - PullRequest
0 голосов
/ 13 октября 2009

Итак, я работаю над клоном CoreDataBooks. Это немного по-другому. При нажатии кнопки «+» запускается navController, содержащий 2 представления. Первый (AddPatientVC) запрашивает имя пациента, затем его отправляют во второй контроллер представления (AddPatientDetailVC), который запрашивает более подробную информацию. Это второй контроллер представления, с которым у меня настроен делегат, а не первый, как в CoreDataBooks.

По какой-то причине, когда вызывается метод делегата, метод уведомления не запускается, поэтому я почему-то потерял отслеживание моего MOC, либо конкретного MOC для добавления нового пациента.

Конкретная ошибка, которую я получаю: '+ entityForName: не удалось найти NSManagedObjectModel для имени сущности' Patient ''

Вот мой код - addPatient, метод делегата и метод уведомления. Любые предложения по упрощению будут оценены. Thanx


    -(void)addPatient:(id)sender
{
    PatientAddViewController *patientAddViewController = [[PatientAddViewController alloc] initWithNibName:@"PatientAddViewController" bundle:nil];

    PatientAddDetailViewController *patientAddDetailViewController = [[PatientAddDetailViewController alloc] initWithNibName:@"PatientAddViewController" bundle:nil];
    patientAddDetailViewController.delegate = self;

    //Create a new MOC for adding a book
    NSManagedObjectContext *addingContext = [[NSManagedObjectContext alloc] init];
    self.addPatientManagedObjectContext = addingContext;
    [addingContext release];


    [addPatientManagedObjectContext setPersistentStoreCoordinator:[[fetchedResultsController managedObjectContext] persistentStoreCoordinator]];
    patientAddViewController.patient = (Patient *)[NSEntityDescription insertNewObjectForEntityForName:@"Patient" inManagedObjectContext:addingContext];



    //patientAddViewController.addPatientManagedObjectContext = self.addPatientManagedObjectContext;
    UINavigationController *addingNavController = [[UINavigationController alloc] initWithRootViewController:patientAddViewController];
    [self.navigationController presentModalViewController:addingNavController animated:YES];

    [addingNavController release];
    [patientAddViewController release];

    }


- (void)patientAddDetailViewController:(PatientAddDetailViewController *)controller didFinishWithSave:(BOOL)save
{
    NSLog(@"Delegate Method fired");
    if (save) 
    {       
        NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter];

        //The notification isn't firing becuase addPatientManagedObjectContext is null for some reason
        [dnc addObserver:self selector:@selector(addControllerContextDidSave:) name:NSManagedObjectContextDidSaveNotification object:addPatientManagedObjectContext];

        NSError *error;
        //if (![patient.managedObjectContext save:&error]) 
        if (![addPatientManagedObjectContext save:&error]) 
        {
            NSLog(@"Before Error");
             //Handle the error...
            NSLog(@"Unresolved Error %@, %@",error, [error userInfo]);
            exit(-1);//Fail
            NSLog(@"After Error");
        }   


        [dnc removeObserver:self name:NSManagedObjectContextDidSaveNotification object:addPatientManagedObjectContext];
    }
    self.addPatientManagedObjectContext = nil;  
    [self.tableView reloadData];

    [self dismissModalViewControllerAnimated:YES];

}

- (void)addControllerContextDidSave:(NSNotification*)saveNotification {

    NSLog(@"Save Notification Fired");

    NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];

    // Merging changes causes the fetched results controller to update its results
    [context mergeChangesFromContextDidSaveNotification:saveNotification];  
}

1 Ответ

0 голосов
/ 13 октября 2009

Похоже, вы создаете контекст и сохраняете его в self

NSManagedObjectContext *addingContext = [[NSManagedObjectContext alloc] init];
self.addPatientManagedObjectContext = addingContext;
[addingContext release];

Но затем вы вызываете метод «add» на другом контроллере:

patientAddViewController.patient = (Patient *)[NSEntityDescription 
  insertNewObjectForEntityForName:@"Patient" inManagedObjectContext:addingContext];

(помните, что вы выпустили «addContext» выше, «addContext» не обязательно содержит что-либо действительное на данный момент)

Похоже, вы должны передать self.addPatientManagedObjectContext вместо addingContext в вашей insertNewObjectForEntityForName:@"Patient" строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...