CoreData - 更新模型类而不是创建新模型

时间:2014-02-07 05:08:32

标签: ios iphone objective-c core-data nsmanagedobject

我在iOS应用程序中使用CoreData。在创建NSManagedObject类时,我大多数时候都会遇到问题。

这就是我的所作所为:

  1. 我在.xcdatamodeld文件中创建了一个实体。
  2. 创建属性和关系。
  3. 选择选项Editor->Create NSManagedObject Class以创建.h.m类。
  4. .h.m类中,我创建了一些用于获取/保存对象的自定义方法。
  5. 到目前为止一切顺利。但是在将来如果我必须更改某些属性,我会重复步骤2和3.但这次我在步骤4中编写的所有自定义代码都会自动删除。

    所以我的问题是我如何更新现有的课程?而不是使用选项Editor->Create NSManagedObject Class来删除我的所有自定义代码。

    感谢任何帮助。

    更新

    测试了两种方法(类别和Mogernator),看起来很好。但我选择了一种纯粹的Xcode方法。我不想承担由于XCode更新而导致将来可能破坏的任何第三方的风险,或者可能导致数据迁移问题。

    感谢@Tom Harrington和@Valentin Shamardin指导我:)

3 个答案:

答案 0 :(得分:11)

要为Core Data模型类创建一些其他方法或其他内容,您必须创建Categories。 Paul Hegarty在Core Data lections中使用了这种方法。

答案 1 :(得分:5)

处理此问题的最佳方法是使用mogenerator生成模型类,而不是让Xcode执行此操作。使用mogenerator,您可以为每个实体获得两个类:

  • 每次重建模型类时重新生成的文件
  • 一个是另一个的子类,只有在你第一次构建模型类时才会生成,而后来的mogenerator永远不会改变。

因此,您可以将所有自定义代码放在子类中,无论重新生成模型类的次数如何,您的代码都不会被覆盖。

答案 2 :(得分:-1)

每当您更改或更新核心数据对象模型时,它都会变得不兼容,无法打开,因此会导致崩溃。 为此,您需要执行核心数据模型版本控制和数据迁移。 版本控制不仅仅是为您提供应用程序将使用的模型版本。核心数据模型中的更改和更新,例如修改实体的任何属性或添加新实体。它与Core数据库模型有关。考虑你的应用程序将使用1.0 ver并使用1的数据库模型。如果你在数据库模型中有一些变化,它的版本增加,现在你的应用程序将使用下一个版本,即2个核心数据库模型

详情请参阅此Apple Doc for Core Data Versioning

这也会导致旧的数据丢失。为此,您需要执行迁移过程。 在迁移期间,Core Data会创建两个堆栈,一个用于源存储,另一个用于目标存储。然后,Core Data从源堆栈中获取对象,并将相应的相应对象插入目标堆栈“。

请参阅Migration on Raywenderlich

上的迁移流程详情

您需要使用NSMigrationManager class