Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CoreData issue: -[NSManagedObject setValue:]: unrecognized selector sent to instance

I just started with CoreData yesterday, and I'm going crazy :( I created a project that uses CoreData (ticked the box -use CoreData). Created the entities, and then created the NSManagedObject classes for all the entities (I suppose they create the 'setter' and 'getter' methods for the entities).

Now, I #imported all these classes in my AppDeletegate and wrote this in my applicationDidFinishLaunching method:

(Subscriptions is one of the Entities in the application)

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");
 }

When I run this, I get this error

[NSManagedObject setTitle:]: unrecognized selector sent to instance 0x6160550

I have no idea why this is happening. Please Help!!! Thanks in advance to everyone!

Adding the header of Subscriptions
Subscriptions.h

@interface Subscriptions : NSManagedObject {
}
@property (nonatomic, retain) NSString * Type;
@property (nonatomic, retain) NSDecimalNumber * Read;
@property (nonatomic, retain) NSString * Title;
@property (nonatomic, retain) NSString * Code;
@property (nonatomic, retain) NSDecimalNumber * New;
@end

I didn't change anything. It's just as Xcode created it.

like image 690
Olsi Avatar asked Dec 28 '10 13:12

Olsi


4 Answers

Just to remind that, don't use capitalized variable name, it might affects the getters and setters not working properly.

If you generated your NSManagedObject subclasses from the data model, everything should goes fine, although it is @dynamic, setters are be implemented by coredata, and because they are already implemented, you should not change it to synthesize. At least for me, coredata returns empty object after I change @dynamic to @synthesize.

And don't forget to set the class name in the data model:

enter image description here

like image 161
b123400 Avatar answered Nov 04 '22 10:11

b123400


I was getting this, and did a Clean on the project and it fixed it.

like image 26
Alper Akture Avatar answered Nov 04 '22 09:11

Alper Akture


I added an attirbute to a Core Data entity, and instead of re-creating the NSManagedObjectSubclass, I tried to get fancy and manually add the @property and @dynamic to the existing subclass.

That didn't work, so I went and re-created the subclass through XCode, which is when I started getting this error ("unrecognized selector sent to instance" when setting a value for the attribute).

So I created a new version of the Core Data Model via XCode, then cleaned, deleted derived data, and then re-created the NSManagedObject subclass. That worked.

It was probably creating a new data model and the new subclass based on that, so I probably didn't need to clean or delete derived data...but it didn't hurt, either!

like image 32
Rembrandt Q. Einstein Avatar answered Nov 04 '22 11:11

Rembrandt Q. Einstein


Two possible problems

Do you have corresponding @dynamic block in the .m file for these properties and

Dont use Capitalised properties, coding conventions are that properties are lowercase for the first letter at least so that when the compiler synthesises the methods.

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

and

@dynamic type; in .m

becomes something like

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

-(NSString *)type
{
return [self primitiveValueForKey:@"type"];
}

in the background. Though you cant see that code ever.

Case conventions are up to you but Camel Caps is nominally normal with Cocoa. But its much like an object such as Big Furry Cat becomes bigFurryCat. Follow the style in the apple examples.

EDIT - change @synthesize to @dynamic

like image 45
Warren Burton Avatar answered Nov 04 '22 09:11

Warren Burton