我创建了自己的类,我想要使用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中幕后运行的额外代码的第二个问题。这是值得担心的还是我应该忽略它?还有其他方法可以解决上述问题吗?
答案 0 :(得分:2)
如果您正在使用SQL后端,请不要在数据模型中使用继承。由于SQL后端的实现,它具有可怕的性能和空间特征。 (这是Apple的建议。)
我可能错了(我会仔细检查),但我认为你可以只使用类和头文件做你想做的事情,而不会弄乱数据模型。 (这假设您不希望在数据后端实际存储您的ivar。)只需像您一样实现MyManagedObject
,并使MyManagedObject
而不是NSManagedObject
固有子类(例如Contact : MyManagedObject
)。 请注意,您只需要在头文件中执行此操作,而不是实际的数据模型。编译器应该弄清楚其余部分。
答案 1 :(得分:1)
看看MOGenerator。它至少可以帮助重新生成托管对象类文件:它为每个文件生成两个文件。您编辑的一个和自动生成的一个。当你重新生成后者时,前者是不受影响的。