Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding custom methods to a subclassed NSManagedObject

I have a Core Data model where I have an entity A, which is an abstract. Entities B, C, and D inherit from entity A. There are several properties defined in entity A which are used by B, C, and D.

I would like to leverage this inheritance in my model code. In addition to properties, I am wondering if I can add methods to entity A, which are implemented in it's sub-entities.

For example:

  1. I add a method to the interface for entity A which returns a value and takes one argument
  2. I add implementations of this method to A, B, C, D
  3. Then, I call executeFetchRequest: to retrieve all instances of B
  4. I call the method on the objects retrieved, which should call the implementation of the method contained in B's implementation

I have tried this, but when calling the method, I receive:

[NSManagedObject methodName:]: unrecognized selector sent to instance

I presume this is because the objects returned by executeFetchRequest: are proxy objects of some sort.

Is there any way to leverage inheritance using subclassed NSManagedObjects?

I would really like to be able to do this, otherwise my model code would be responsible for determining what type of NSManagedObject it's dealing with and perform special logic according to the type, which is undesirable.

Any help is appreciated, thanks in advance.

like image 627
CJ. Avatar asked Jan 27 '10 21:01

CJ.


People also ask

How do I create a subclass in NSManagedObject?

From the Xcode menu bar, choose Editor > Create NSManagedObject Subclass. Select your data model, then the appropriate entity, and choose where to save the files. Xcode places both a class and a properties file into your project.

How do you use transformable Core Data?

To implement a Transformable attribute, configure it by setting its type to Transformable and specifying the transformer and custom class name in Data Model Inspector, then register a transformer with code before an app loads its Core Data stack.

What is NSManagedObject in Core Data?

In some respects, an NSManagedObject acts like a dictionary—it's a generic container object that provides efficient storage for the properties defined by its associated NSEntityDescription instance.

What are fetched properties in Core Data?

Fetched Properties in Core Data are properties that return an array value from a predicate. A fetched property predicate is a Core Data query that evaluates to an array of results.


1 Answers

It should work. The objects returned by executeFetchRequest: are real instances of NSManagedObjects (or subclasses thereof.) The steps to use custom classes in CoreData are as follows. Say you have entities A and B, where B inherits from A. Then you need two custom classes as

@interface A:NSManagedObject{
}
-(void)someMethod:(NSString*)a;
@end;
@interface B:A{
}
-(void)someMethod:(NSString*)a;
@end;

Then set them in the XCode data modeler as shown:

screenshot of XCode modeler

This way, the CoreData automatically assigns the correct class to the NSManagedObject when it is fetched from the database.

like image 84
Yuji Avatar answered Sep 22 '22 03:09

Yuji