5 votes

Erreur de don de données de base

Je travaille avec Core Data et j'essaie de lui faire afficher des données avec un modèle de données simple. L'application se bloque et me donne ce message d'erreur

Fermeture de l'application en raison d'une exception non attrapée 'NSInvalidArgumentException', raison : '+entityForName : nil n'est pas un paramètre NSManagedObjectContext légal pour la recherche du nom d'entité 'Remind''.

Je ne suis pas totalement sûr mais si je comprends bien, il dit qu'il ne peut pas trouver mon entité appelée Remind ? Or, j'ai bel et bien une entité appelée Remind.

J'ai aussi mis des points d'arrêt et ça s'arrête juste ici : enter image description here

Toute aide serait grandement appréciée. Je suis complètement dans une impasse.

Code du contexte géré dans App Delegate .m

enter image description here

1voto

Jason Coco Points 52303

Le problème ici est que votre accesseur et votre ivar ont le même nom. C'est de là que vient la convention ivar underbar. Ici, vous n'utilisez pas l'accesseur pour accéder à votre propriété, vous utilisez directement la variable de support, qui ne sera donc jamais initialisée. Au lieu de cela, assurez-vous de toujours passer par les méthodes de votre accesseur et vous n'aurez pas de problème. Réécrivez donc la méthode incriminée (et toutes les autres qui utilisent l'accesseur managedContextObject avec quelque chose comme ce qui suit :

- (void)viewWillAppear:(BOOL)animated
{
  [super viewWillAppear:animated]; // it's good practice to call the super methods, even if you're fairly certain they do nothing

  // Get a reference to the managed object context *through* the accessor
  NSManagedObjectContext* context = [self managedObjectContext];

  // From now on, we only use this reference in this method
  NSFetchRequest = [[NSFetchRequest alloc] init];
  NSEntityDescription* entity = [NSEntityDescription entityForName:@"Remind" inManagedObjectContext:context]; // <- use the local reference we got through the accessor
  [request setEntity:entity];
  NSError* error = nil;
  NSArray* array = [context executeFetchRequest:request error:&error];
  if( !array ) {
    // Do something with the error
    NSLog(@"Error Fetching: %@", error);
  }
  [self setDesitnationsArray:[array mutableCopy]];
  [destinationsTableView reloadData];
}

Vous voudrez peut-être changer vos ivars pour quelque chose que vous ne serez pas tenté d'utiliser ou qui montrera immédiatement que vous n'avez pas passé en revue les accesseurs, par exemple _managedObjectContext ou même _privateContext ou quoi que ce soit d'autre vous sautera aux yeux jusqu'à ce que vous vous habituiez à accéder aux propriétés par le biais des accesseurs. Si vous n'aimez pas la syntaxe Objective-C pour accéder aux propriétés, vous pouvez utiliser la syntaxe point, mais vous devez toujours vous rappeler de passer par self par exemple, self.managedObjectContext . Je n'aime pas cette méthode car les gens oublient qu'il ne s'agit pas d'un accès direct à la propriété et qu'ils utilisent les accesseurs. Ils pensent donc qu'il est acceptable d'interchanger la syntaxe du point pour un accès direct, alors que ce n'est pas le cas (comme dans votre cas).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X