使用Core Data的好设计?

时间:2011-06-26 15:21:19

标签: core-data model nsmanagedobject

要使用CoreData,许多开发人员都会从NSManagedObject继承模型对象。

但是如果我想让我的模型对象独立于正在使用的存储机制(也许我会在一个我根本不需要持久性的项目中重用它们)呢?

到目前为止,我的解决方案是为每个模型类创建一个继承自NSManagedObject的类,该类具有对模型对象的引用并加载和存储它。

什么是更好的方法?

3 个答案:

答案 0 :(得分:3)

目前无法创建可由Core Data持久保存并且与Core Data完全断开连接的实体。从NSManagedObject继承的任何内容都带有一些包袱,尤其是如果没有为每个对象设置一些自定义代码,就无法对其进行序列化。

您可以创建一些代表您的Core Data托管对象所遵循的每个实体的协议,就像您的独立对象一样。您可以在NSObject上使用仅符合您的实体协议的类别来实现Core Data和独立实体共享的行为。通过使类别仅适用于符合您的实体协议的类,可以防止该类别应用于每个NSObject(非常糟糕)。相反,它仅适用于您实现的符合该类别的类。这是我发现在核心数据实体和独立实体之间共享一些代码的唯一方法。

为了防止每次更改模型时丢失对Core Data实体所做的任何更改,我使用mogenerator重新生成实体而不是XCode。这让我可以将Core Data特定的东西与我在实体上需要的任何自定义分开(例如为实体应用协议)。如果您使用的是XCode 3,则mogenerator包含一个处理XCode集成的插件。如果您使用的是XCode 4,则该插件不起作用,但在DevForums我wrote up a tutorial上的另一位开发人员的帮助下,让mogenerator工作。

答案 1 :(得分:1)

  

但是,如果我想保留我的模型怎么办?   独立于存储的对象   正在使用的机制(也许是我   将在我所在的项目中重复使用它们   根本不需要持久性?)

使用Core Data,持久性只是一种选择,它不是必需的,因为Core Data主要不是持久性API。相反,它是一个对象图管理API,旨在提供模型 - 视图 - 控制器设计应用程序的完整模型层。它的真正功能是管理图形中的对象,以便准确地建模/模拟真实世界的对象,条件或事件以及它们之间的关系。

您可以在持久性存储协调器级别更改持久性选项。您可以选择使用sqlite存储,二进制存储,xml plist存储或内存存储,顾名思义,它根本不是一个“持久”存储。您还可以选择编写自己的自定义商店。有关详细信息,请参阅Atomic Store Programming Topics

您确实需要托管对象上下文来从Core Data获取任何值。他们应该将其命名为“NSManagedObjectManager”,而不是将其命名为“NSManagedObjectContext”,因为这样就完成了所有自动对象图维护。如果您想复制该功能,您必须基本上编写自己的经理类。

在我看来,为您提供的灵活性提供保险的最佳方式是,您可以使用序列化方法将其编写为常见的数据格式(如JSON)。然后,如果您需要切换到另一个持久性选项,您只需将Core Data对象图转换为JSON并发送到任何地方。

但是,除非你已经确定需要这样的功能,否则我真的不会打扰。它非常非常罕见。最好只针对已知需求进行编码,然后只在实际显示时为新需求节省时间。

答案 2 :(得分:1)

使用Core Data的最佳方法是从NSManagedObject继承模型对象。然后,您可以控制是否继续保持上下文,例如TechZen指出。

如果仍然坚持不从NSManagedObject继承模型类,那么如RyanR所描述的那样组合协议和类别会有所帮助。但是,在我看来,创建协议,类别和重复类会产生很大的开销。