CoreData - 更新模型类而不是创建新的
Posted
技术标签:
【中文标题】CoreData - 更新模型类而不是创建新的【英文标题】:CoreData - Update model class instead of creating new 【发布时间】:2014-02-07 05:08:31 【问题描述】:我在我的 ios 应用程序中使用 CoreData。在创建NSManagedObject
类时,我大多数时候都会遇到问题。
这就是我的工作:
-
我在
.xcdatamodeld
文件中创建了一个实体。
创建属性和关系。
选择选项Editor->Create NSManagedObject Class
以创建.h
和.m
类。
在.h
和.m
类中,我创建了一些用于获取/保存对象的自定义方法。
到目前为止一切顺利。但是以后如果我必须更改某些属性,我会重复第 2 步和第 3 步。但这一次,我在第 4 步中编写的所有自定义代码都会自动删除。
所以我的问题是如何更新现有的类?而不是使用选项Editor->Create NSManagedObject Class
删除我所有的自定义代码。
感谢任何帮助。
更新:
测试了两种方法(Categories 和 Mogernator),对我来说看起来不错。但我选择了作为纯 Xcode 方法的类别。我不想冒任何第三方可能因 XCode 更新而中断或可能导致数据迁移问题的风险。
感谢@Tom Harrington 和@Valentin Shamardin 指导我:)
【问题讨论】:
您无法更新现有的类,Xcode 将始终覆盖文件。您可以使用类别(如下面的答案所述)或使用“mogenerator”(参见***.com/questions/18190845/… 进行比较)。但在这两种情况下,每个实体都有两个类。 【参考方案1】:要为您的核心数据模型类创建一些额外的方法或其他东西,您必须创建Categories。这种方法被 Paul Hegarty 在 Core Data 中使用。
【讨论】:
在上述情况下类别如何提供帮助? @GMJigar,重写NSManagedObject
子类不会重写类别类。
@Valentin,我尝试创建匿名类别(我的 .m 类中的类别)。它仍然被覆盖。你有一些示例代码或链接吗?
@ValentinShamardin,我已经下载了 Paul 的示例代码,并运行了它。我可以看到他创建了单独的类别类。但这会使文件数量增加一倍。我的应用程序已经有 30 多个实体。因此,如果我使用单独的类别类,它可以达到 60 :(。我不想那样做。
拥有 60 个文件有什么顾虑?许多项目的文件远不止于此。我也有一个包含大约 30 个实体的项目,我对所有自定义项都使用类别,而且它非常易于管理。【参考方案2】:
处理这个问题的最好方法是使用mogenerator 来生成你的模型类,而不是让 Xcode 来做。使用 mogenerator,您可以为每个实体获得两个类:
每次重建模型类时都会重新生成一个 一个是另一个的子类,它仅在您第一次构建模型类时生成,之后不再更改。因此,您可以将所有自定义代码放入子类中,并且无论您重新生成模型类多少次,您的代码都不会被覆盖。
【讨论】:
这就是我要写的——mogenerator
为我节省了很多时间。
谢谢@Tom,我会试试的。
@Tom Harrington,我试过mogenerator
,感觉很好。只是想知道模态文件放置的最佳实践。目前mogenerator
只是将每个实体的所有 4 个文件放在我的Modals
目录/组中。我有近 30 个实体意味着 120 个文件。这将使搜索变得困难。所以我该怎么做?我应该为每个实体创建一个组还是只创建 2 个组(首先是所有 _
文件,第二个是所有自定义文件)。我想确认的另一个问题是,它不会给未来的模态迁移带来任何问题吗?
我喜欢为每次重新生成的文件(带有_
的文件)创建一个 Xcode 组,并为其余的文件创建一个单独的组。为每个实体创建一个组并没有真正的帮助,因为您将拥有太多组。这些都与模型迁移无关。【参考方案3】:
每当您更改或更新您的核心数据对象模型时,它就会变得不兼容并且无法打开,从而导致崩溃。 为此,您需要执行核心数据模型版本控制和数据迁移。 版本控制只是为您提供应用程序将使用的模型版本。核心数据模型的更改和更新,例如修改实体的任何属性或添加新实体。它与Core数据库模型有关。考虑您的应用程序将使用 1.0 版本并使用 1 的数据库模型。如果您在数据库模型中有一些更改,它的版本会增加,现在您的应用程序将使用下一个版本,即核心数据库模型 2
详情参考此Apple Doc for Core Data Versioning
这也会导致旧数据丢失。为此,您需要执行迁移过程。 在迁移过程中,Core Data 创建了两个堆栈,一个用于源存储,一个用于目标存储。然后,Core Data 从源堆栈中获取对象并将相应的相应对象插入到目标堆栈中”。
请参阅Migration on Raywenderlich上的迁移过程详细信息
你需要使用NSMigrationManager class和
【讨论】:
感谢您的回复,但我对核心数据版本控制或迁移不感兴趣。这与我的问题无关。 :)以上是关于CoreData - 更新模型类而不是创建新的的主要内容,如果未能解决你的问题,请参考以下文章