代码之家  ›  专栏  ›  技术社区  ›  Senseful

如何使所有核心数据对象继承自我的类而不是nsmanagedObject?

  •  2
  • Senseful  · 技术社区  · 14 年前

    我创建了自己的类,我希望核心数据使用,而不是 NSManagedObject :

    @interface MyManagedObject: NSManagedObject {
      id delegate;
    }
    

    我不能使用类别,因为这声明了一个IVAR。我所有的核心数据对象都使用具体的类,而不是 被管理对象 . 我使用代码生成器生成这些文件。下面是一个例子 Contact 对象可能看起来像:

    @interface Contact: NSManagedObject {
    }
    

    我知道我可以手动更改 被管理对象 MyManagedObject 在这个生成的代码中,但每次重新生成代码时都需要这样做。有没有办法让它自动使用我自己的班级?

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


    我尝试在 .xcdatamodel 具有相同名称并指定所有对象都继承自该文件的文件,但有两个问题。第一个是它正在使用 #导入“myManagedObject.h” 因为我上面指定的原因找不到。第二个问题是,我不确定欺骗核心数据以为类是从另一个核心数据对象继承的是一个好主意…即使我没有生成代码文件。我猜想核心数据可能在幕后做了一些不必要的事情,因为它相信有一个额外的类是我的类所继承的。

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

    #import "MyLib/MyManagedObject.h"
    
    @interface MyProjectManagedObject: MyManagedObject {
    }
    

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

    #import "MyProjectManagedObject.h"
    
    @interface Contact: MyProjectManagedObject {
    }
    

    …那就行了。唯一的问题是我上面提到的第二个关于在核心数据中后台运行额外代码的问题。这是值得担心的事情还是我应该忽略它?有没有其他方法可以解决上述两个问题?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Amy Worrall    14 年前

    看一下发电机。它至少有助于重新生成托管对象类文件:它为每个文件生成两个文件。一个是您编辑的,另一个是自动生成的。当你再生后一个,前一个是不动的。

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

        2
  •  2
  •   shosti    14 年前

    如果使用的是SQL后端,则不要在数据模型中使用继承。 由于SQL后端的实现,它具有糟糕的性能和空间特性。(这是苹果的建议。)

    我可能是错的(我将再次检查),但我认为您可以使用类和头文件来做您想要做的事情,而不会影响数据模型。(假设您不想将IVAR实际存储在数据后端。)只需实现 MyManagedObject 就像你做的那样,让你的子类从 MyMaungDead对象 而不是 NSManagedObject (例如) Contact : MyManagedObject ) 请注意,您只需要在头文件中执行此操作,而不必在实际的数据模型中执行此操作。 编译器应该计算出其余的部分。