tutorial español data iphone objective-c core-data ios nsmanagedobject

iphone - español - Problema de CoreData:-[NSManagedObject setValue:]: selector no reconocido enviado a la instancia



core data swift 4 español (8)

Empecé con CoreData ayer, y me estoy volviendo loco :( Creé un proyecto que usa CoreData (marcó la casilla -use CoreData). Creé las entidades y luego creé las clases NSManagedObject para todas las entidades (supongo que crean los métodos ''setter'' y ''getter'' para las entidades).

Ahora, importé todas estas clases en mi AppDeletegate y escribí esto en mi método applicationDidFinishLaunching:

(Suscripciones es una de las entidades en la aplicación)

NSManagedObjectContext *context = [self managedObjectContext]; Subscriptions *sbs = (Subscriptions *)[NSEntityDescription insertNewObjectForEntityForName:@"Subscriptions" inManagedObjectContext:context]; [sbs setTitle:@"OK"]; [sbs setType:@"Tag"]; [sbs setCode:@"cars"]; NSError *error = nil; if (![context save:&error]) { NSLog(@"Couldn''t create the subscription"); }

Cuando ejecuto esto, obtengo este error

[NSManagedObject setTitle:]: selector no reconocido enviado a la instancia 0x6160550

No tengo idea de por qué está sucediendo esto. ¡¡¡Por favor ayuda!!! ¡Gracias de antemano a todos!

Agregar el encabezado de Suscripciones
Suscripciones.h

@interface Suscripciones: NSManagedObject {
}
@property (nonatomic, retener) NSString * Type;
@property (nonatomic, retener) NSDecimalNumber * Read;
@property (no atómico, retener) NSString * Título;
@property (nonatomic, retener) NSString * Código;
@property (nonatomic, retener) NSDecimalNumber * New;
@fin

No cambié nada. Es justo como Xcode lo creó.


Me parece que el atributo Título no se puede establecer en cadena. ¿Lo has comprobado?

Por lo general, el selector no reconocido enviado a instancia es un error de tiempo de ejecución al enviar un mensaje a un objeto que el objeto no sabe cómo manejar.

Subscriptions *sbs = (Subscriptions *)[NSEntityDescription insertNewObjectForEntityForName:@"Subscriptions" inManagedObjectContext:context]; sbs.Title = @"OK";

Espero que ayudes

Hice un proyecto simple aquí.


Solo para recordarle que no use el nombre de la variable en mayúscula, podría afectar a los getters y setters que no funcionan correctamente.

Si generó sus subclases NSManagedObject del modelo de datos, todo debería ir bien, aunque es @dynamic, los adaptadores se implementan por coredata y, como ya están implementados, no debe cambiarlos para que se sinteticen. Al menos para mí, coredata devuelve un objeto vacío después de cambiar @dynamic a @synthesize.

Y no te olvides de configurar el nombre de clase en el modelo de datos:


Estaba obteniendo esto, hice un proyecto Clean en el proyecto y lo solucionó.


Descubrí que al tener relaciones con las entidades tenía que asegurarme de que algunas de mis relaciones serían muchas, tomé una captura de pantalla para que pueda ver lo que quiero decir, una relación de múltiples es indicada por la flecha de doble punta


Tuve el mismo problema y encontré una solución no tan elegante. Parece que

[NSEntityDescription insertNewObjectForEntityForName:@"myEntity" inManagedObjectContext:myManagedObjectContext];

crea una versión anterior de myEntity que no tiene los atributos de la versión más actualizada. Así que cambié el nombre de myEntity en la versión anterior del modelo a myEntityOld y ya no recibí el error.

Sospecho que hay una manera elegante de hacer lo mismo en XCode estableciendo una propiedad de NSManagedObject o NSEntityDescription .


Dos posibles problemas

¿Tiene el bloque @dynamic correspondiente en el archivo .m para estas propiedades y

No use las propiedades en mayúscula, las convenciones de codificación son que las propiedades son minúsculas para la primera letra al menos, de modo que cuando el compilador sintetice los métodos.

@property (nonatomic, retain) NSString * type; en .h

y

@dynamic type; En m

se convierte en algo así como

-(void)setType:(NSString *)atype { .... [self willChangeValueForKey:@"type"]; [self setPrimitiveValue:atype forKey:@"type"]; [self didChangeValueForKey:@"type"]; } -(NSString *)type { return [self primitiveValueForKey:@"type"]; }

en el fondo. Aunque no puedes ver ese código alguna vez.

Las convenciones de casos dependen de usted, pero Camel Caps es nominalmente normal con Cocoa. Pero es muy parecido a un objeto como Big Furry Cat convierte en bigFurryCat . Sigue el estilo en los ejemplos de apple.

EDITAR - cambia @synthesize a @dynamic


Agregué un attirbute a una entidad Core Data, y en lugar de volver a crear NSManagedObjectSubclass, traté de hacerme elegante y agregar manualmente @property y @dynamic a la subclase existente.

Eso no funcionó , así que fui y volví a crear la subclase a través de XCode, que es cuando comencé a recibir este error ("selector no reconocido enviado a instancia" al establecer un valor para el atributo).

Así que creé una nueva versión del Core Data Model a través de XCode , luego limpié, eliminé los datos derivados y luego volví a crear la subclase NSManagedObject . Eso funciono.

Probablemente estaba creando un nuevo modelo de datos y la nueva subclase basada en eso, así que probablemente no necesité limpiar o eliminar datos derivados ... ¡pero tampoco me dolió!


sigue los siguientes pasos

1) creó una nueva versión del Core Data Model a través de Xcode.

2) Corregir la relación (se agregó una nueva relación entre los dos).

Creando Relaciones de Objetos Administrados

3) recreó la subclase NSManagedObject