objective-c - core data swift
CoreData: error: error al invocar el inicializador designado en la clase NSManagedObject (5)
Adicionalmente, si su clase de desafíos es NSManagedObject y la fecha, las rondas y las tomas se definen como sus atributos, puede agregar el método:
-(void) awakeFromInsert {
self.date = [NSDate date];
self.rounds = @(12);
self.shots = @(5);
}
Cada nuevo objeto habrá definido esos atributos desde su nacimiento.
Tengo un pequeño problema con CoreData. Quiero insertar un nuevo Objeto, así que primero tengo que crear uno. Esto es hecho por ese código:
Challenges *newChallenge = [[Challenges alloc] init];
[newChallenge setName:@"TestChallenge"];
[newChallenge setRounds:[[NSNumber alloc] initWithInt:12]];
[newChallenge setShots:[[NSNumber alloc] initWithInt:5]];
[newChallenge setDate:[NSDate date]];
Pero, sin embargo, después del alloc init obtengo este error:
CoreData: error: Failed to call designated initializer on NSManagedObject class ''Challenges''
¿Qué está haciendo el truco?
Creo que el problema es que Challenges es una clase NSManagedObject
y necesitas el inicializador designado:
initWithEntity:insertIntoManagedObjectContext:
en lugar de
Challenges *newChallenge = [[Challenges alloc] init];
En caso de que te preguntes "OK, ¿cómo puedo obtener esa entidad?" (como yo lo hice), haces esto usando el método entityForName de esta manera:
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Challenges" inManagedObjectContext:self.managedObjectContext];
Challenges *newChallenge = [[Challenge alloc] initWithEntity:entity insertIntoManagedObjectContext:self.managedObjectContext];
Espero que esto ayude, ¡este hilo me ha ayudado mucho!
Otros ya han declarado por qué no está funcionando. Aquí se explica cómo puede reducir el texto estándar y hacer que su código sea más legible:
@implementation NSManagedObject(MyPrivateAdditions)
+ (id)insertNewObjectInContext:(NSManagedObjectContext *)context
{
return [NSEntityDescription insertNewObjectForEntityForName:self.className inManagedObjectContext:context];
}
@end
ahora puedes hacer:
Challenges *newChallenge = [Challenge insertNewObjectInContext:context];
NSManagedObject
no puede ser solo alloc
/ init
como lo haría normalmente con un NSObject
. Como cuestión de hecho, el inicializador designado es: initWithEntity:insertIntoManagedObjectContext:
Ahora, para el error real, Apple declara en la documentación que:
Importante : este método es el inicializador designado para NSManagedObject. No debe inicializar un objeto gestionado simplemente enviándolo init.
Entonces, podría ver que necesita 2 cosas para inicializarlo, una NSEntityDescription
(qué entidad tiene la intención de crear una instancia) y un NSManagedObjectContext
(el contexto en el que se creará el nuevo objeto).