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?
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];
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é!
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 ).
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];
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.