web-dev-qa-db-fra.com

CoreData: erreur: impossible d'appeler l'initialiseur désigné sur la classe NSManagedObject

J'ai un sacré petit problème avec CoreData. Je veux insérer un nouvel objet, donc je dois d'abord en créer un. Cela se fait par ce code:

Challenges *newChallenge = [[Challenges alloc] init];
[newChallenge setName:@"TestChallenge"];
[newChallenge setRounds:[[NSNumber alloc] initWithInt:12]];
[newChallenge setShots:[[NSNumber alloc] initWithInt:5]];
[newChallenge setDate:[NSDate date]];

Mais cependant, après l'init alloc, j'obtiens cette erreur:

CoreData: error: Failed to call designated initializer on NSManagedObject class 'Challenges'

Qu'est-ce qui se passe mal?

38
Bene

Je pense que le problème est que Challenges est une classe NSManagedObject et vous avez besoin de l'initialiseur désigné:

initWithEntity:insertIntoManagedObjectContext:

au lieu de

Challenges *newChallenge = [[Challenges alloc] init];

Lire la suite ..

60
duDE

Dans le cas où vous vous demandez "OK, alors comment puis-je obtenir cette entité?" (comme je l'ai fait), vous faites cela en utilisant la méthode entityForName comme ceci:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Challenges" inManagedObjectContext:self.managedObjectContext];

Challenges *newChallenge = [[Challenge alloc] initWithEntity:entity insertIntoManagedObjectContext:self.managedObjectContext];

J'espère que cela aide, ce fil m'a beaucoup aidé!

30
Jay Versluis

NSManagedObject ne peut pas être simplement alloc/init comme vous le feriez normalement avec un NSObject. En fait, l'initialiseur désigné est: initWithEntity:insertIntoManagedObjectContext:

Maintenant, pour l'erreur réelle, Apple indique dans la documentation que:

Important : cette méthode est l'initialiseur désigné pour NSManagedObject. Vous ne devez pas initialiser un objet géré simplement en l'envoyant init.

Ainsi, vous pouvez voir que vous avez besoin de 2 choses pour l'initialiser, une NSEntityDescription (quelle entité vous avez l'intention d'instancier) et une NSManagedObjectContext (le contexte dans lequel le nouvel objet sera créé dans ).

13
Alladinian

D'autres ont déjà expliqué pourquoi cela ne fonctionnait pas. Voici comment réduire le passe-partout et rendre votre code plus lisible:

@implementation NSManagedObject(MyPrivateAdditions)

+ (id)insertNewObjectInContext:(NSManagedObjectContext *)context
{
    return [NSEntityDescription insertNewObjectForEntityForName:self.className inManagedObjectContext:context];
}

@end

maintenant vous pouvez faire:

Challenges *newChallenge = [Challenge insertNewObjectInContext:context];
4
bernstein

De plus, si votre classe Challenges est NSManagedObject et la date, les tours et les tirs sont définis comme ses attributs, vous pouvez ajouter une méthode:

-(void) awakeFromInsert {
     self.date = [NSDate date];
     self.rounds = @(12);
     self.shots = @(5);
}

Chaque nouvel objet aura défini ces attributs dès sa naissance.

4
Łukasz