Core data 使用CoreData的良好设计?

Core data 使用CoreData的良好设计?,core-data,model,nsmanagedobject,Core Data,Model,Nsmanagedobject,为了使用CoreData,许多开发人员从NSManagedObject继承模型对象 但是,如果我想让我的模型对象独立于正在使用的存储机制(也许我会在一个根本不需要持久性的项目中重用它们),该怎么办 到目前为止,我的解决方案是为每个模型类创建一个继承自NSManagedObject的类,该类具有对模型对象的引用,并加载和存储它 什么是更好的方法?目前没有办法创建可以由核心数据持久化并与核心数据完全断开连接使用的实体。从NSManagedObject继承的任何东西都会带来一些负担,其中最重要的一点是

为了使用CoreData,许多开发人员从
NSManagedObject
继承模型对象

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

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


什么是更好的方法?

目前没有办法创建可以由核心数据持久化并与核心数据完全断开连接使用的实体。从NSManagedObject继承的任何东西都会带来一些负担,其中最重要的一点是,如果没有每个对象的自定义代码,就无法序列化它

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

为了防止每次更改模型时丢失对核心数据实体所做的任何更改,我使用重新生成实体而不是XCode。这使我能够将特定于核心数据的内容与实体上所需的任何定制分离(例如为实体应用协议)。如果您使用的是XCode 3,mogenerator将包含一个处理XCode集成的插件。如果您使用的是XCode 4,那么该插件将无法工作,但在DevForums上的另一位开发人员的帮助下,我将帮助您让mogenerator正常工作

但是如果我想保留我的模型呢 独立于存储的对象 正在使用的机制(可能是我 将在项目中重用它们 根本不需要坚持吗


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

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

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

在我看来,为您寻求的那种灵活性提供保障的最佳方法是,用序列化方法将其写入一种常见的数据格式,如JSON。然后,如果您需要切换到另一个持久性选项,您可以将核心数据对象图转换为JSON并发送到任何地方


然而,除非您已经确定需要这样的功能,否则我真的不会麻烦您。这是非常非常罕见的。最好只为已知的需求编写代码,然后在新需求实际出现时才为它们浪费时间

处理核心数据的最佳方法是从NSManagedObject继承模型对象。然后,您可以控制是否从上下文中持久化,如TechZen


如果您仍然坚持不从NSManagedObject继承您的模型类,那么按照RyanR的描述将协议和类别结合起来可能会有所帮助。但是,在我看来,创建协议、类别和复制类会带来很大的开销。

+1实际上,您可以在没有上下文的情况下使用托管对象,但您不会得到任何“托管”对象,因为上下文是实际的管理器,它确保设置所有交互关系并强制执行所有验证。功能的巨大损失使得在没有上下文的情况下使用托管对象变得毫无意义。您正在描述一个结合协议和类别的非常有趣的解决方案,我想当您的客户机需要与具有公共接口的对象(如代理模式?)交互时,这将非常有用。你基本上是说我复制模型对象的方法很好?感谢您提供有关MoGenerator的信息。如果您遵循此模式,您要复制的所有内容都是数据存储(ivars)——对象的行为通过类别共享。我已经在为客户编写的几个大型业务应用程序中成功地使用了它。性能非常出色,而且业务规则经过整合后,维护起来非常容易。感谢您提供的信息。您可以从其他类控制是否坚持,这很好。但是,您是否总是从NSManagedObject继承模型类?也许我太保守了,但让我的类从外部类继承并不舒服。为什么我要在另一个项目中使用CoreData呢?我不需要持久性,也不需要你描述的对象图。也许我有点不知道它有多强大。您个人是否总是有这种需要?核心数据主要不是持久性API。它是用于创建模型Vie的整个模型层的API