Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios CoreData-更新模型类而不是创建新的_Ios_Iphone_Objective C_Core Data_Nsmanagedobject - Fatal编程技术网

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

Ios CoreData-更新模型类而不是创建新的,ios,iphone,objective-c,core-data,nsmanagedobject,Ios,Iphone,Objective C,Core Data,Nsmanagedobject,我正在iOS应用程序中使用CoreData。在创建NSManagedObject类时,我经常遇到一个问题 我就是这么做的: 我在.xcdatamodeld文件中创建了一个实体 创建属性和关系 选择选项Editor->Create NSManagedObject Class以创建.h和.m类 在.h和.m类中,我创建了一些用于获取/保存对象的自定义方法 到目前为止还不错。但以后如果我必须更改某些属性,我会重复第2步和第3步。但这一次,我在步骤4中编写的所有自定义代码都将自动删除 所以我的问题是如何

我正在iOS应用程序中使用CoreData。在创建
NSManagedObject
类时,我经常遇到一个问题

我就是这么做的:

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

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

    感谢您的帮助

    更新:

    测试了两种方法(类别和mogerator),我觉得很好。但我选择了纯Xcode方法的类别。我不想冒任何第三方的风险,因为将来可能会因为XCode更新而中断,或者可能导致数据迁移问题


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

    为您必须创建的核心数据模型类创建一些附加方法或其他内容。Paul Hegarty在核心数据选择中使用了这种方法。

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

    细节是指这一点

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

    请参阅有关迁移过程的详细信息


    您需要使用和

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

    • 每次重建模型类时都会重新生成的
    • 一个是另一个的子类,它只在您第一次构建模型类时生成,之后mogenerator永远不会更改

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

    在上述情况下,类别有何帮助?@GMJigar,重写
    NSManagedObject
    子类不会重写类别类。@Valentin,我尝试过创建匿名类类别(my.m类中的类别)。它仍然被覆盖。你有一些示例代码或链接吗?@ValentinShamardin,我已经下载了Paul的示例代码,并运行了它。我可以看到他创建了单独的类别类。但这使文件数量增加了一倍。我的应用程序已经有30多个实体。因此,如果我使用单独的类别,它可以在pto 60:(.我不想这样做。拥有60个文件有什么关系?许多项目的文件远不止这些。我的项目也有大约30个实体,我的所有自定义都使用类别,而且非常易于管理。你不能更新现有的类,Xcode将始终覆盖这些文件。你可以使用类别(如下面的回答所述)或使用“mogenerator”(请参阅以进行比较)。但在这两种情况下,每个实体都有两个类。感谢您的回答,但我对核心数据版本控制或迁移不感兴趣。这与我的问题无关。:)这就是我要写的-
    mogenerator
    为我节省了很多时间。谢谢@Tom,我会试试。@Tom Harrington,我试过
    mogenerator
    ,感觉很好。我只是想知道你放置模态文件的最佳实践。目前
    mogenerator
    只是将每个实体的所有4个文件放在我的
    模态文件中ode>目录/组。我有将近30个实体意味着120个文件。这将使搜索变得困难。那么我应该怎么做?我应该为每个实体创建一个组,还是只创建两个组(第一个组用于所有
    \uuuu
    文件,第二个组用于所有自定义文件)。我想确认的另一个问题是,它是否会在将来的模式迁移中产生任何问题?我想为每次重新生成的文件创建一个Xcode组(那些带有
    \uuuu
    )为每个实体创建一个组并没有真正的帮助,因为您将有太多的组。所有这些都与模型迁移无关。