如何使所有Core Data对象继承自我的类而不是NSManagedObject?

时间:2010-08-25 00:24:01

标签: objective-c inheritance core-data

我创建了自己的类,我想要使用Core Data而不是NSManagedObject

@interface MyManagedObject: NSManagedObject {
  id delegate;
}

我不能使用类别,因为这声明了一个ivar。我的所有Core Data对象都使用具体的类而不是NSManagedObject的实例。我使用代码生成器生成这些文件。以下是Contact对象的示例:

@interface Contact: NSManagedObject {
}

我知道我可以在此生成的代码中手动将NSManagedObject更改为MyManagedObject,但每次重新生成代码时都需要执行此操作。有没有办法让它自动使用我自己的课程?

此外,任何解决方案中的#import都可能存在问题。理想情况下,我希望它使用@class MyManagedObject而不是#import "MyManagedObject.h",因为MyManagedObject.h位于库中,并且标头需要可访问的文件夹前缀(例如#import "MyLib/MyManagedObject.h")。< / p>


我尝试在.xcdatamodel文件中创建一个具有相同名称的虚拟对象,并指定所有对象都从其继承,但有两个问题。第一个是它正在使用#import "MyManagedObject.h",由于我在上面指定的原因,它无法找到它。第二个问题是我不确定愚弄Core Data认为该类继承自另一个Core Data对象是个好主意......即使我没有生成代码文件。我猜测Core Data可能会在幕后做一些不必要的事情,因为它认为我的类继承了一个额外的类。

我想我可以使用另一层类来解决第一个问题。例如,我将指定对象从MyProjectManagedObject继承并在我的项目中创建MyProjectManagedObject.h文件:

#import "MyLib/MyManagedObject.h"

@interface MyProjectManagedObject: MyManagedObject {
}

...现在我的自动生成的文件将如下所示:

#import "MyProjectManagedObject.h"

@interface Contact: MyProjectManagedObject {
}

......哪个会奏效。唯一的问题是我上面提到的关于在Core Data中幕后运行的额外代码的第二个问题。这是值得担心的还是我应该忽略它?还有其他方法可以解决上述问题吗?

2 个答案:

答案 0 :(得分:2)

如果您正在使用SQL后端,请不要在数据模型中使用继承。由于SQL后端的实现,它具有可怕的性能和空间特征。 (这是Apple的建议。)

我可能错了(我会仔细检查),但我认为你可以只使用类和头文件做你想做的事情,而不会弄乱数据模型。 (这假设您不希望在数据后端实际存储您的ivar。)只需像您一样实现MyManagedObject,并使MyManagedObject而不是NSManagedObject固有子类(例如Contact : MyManagedObject)。 请注意,您只需要在头文件中执行此操作,而不是实际的数据模型。编译器应该弄清楚其余部分。

答案 1 :(得分:1)

看看MOGenerator。它至少可以帮助重新生成托管对象类文件:它为每个文件生成两个文件。您编辑的一个和自动生成的一个。当你重新生成后者时,前者是不受影响的。

http://digitalflapjack.com/blog/2010/mar/26/mogeneratorftw/