将旧的Core Data模型导入新项目

时间:2012-03-17 04:35:40

标签: ios xcode core-data

我有一个旧的Xcode项目,其中包含一个CoreData模型(包含模型的版本1和版本2)。出于几个原因,我需要创建一个新的Xcode项目并将所有代码传输到新项目。

如何以这样的方式导入/传输我的旧CoreData模型:这个新的二进制文件仍然能够读取并可能迁移现有用户的iPhone和iPad上的现有CoreData存储库?我担心,如果我使用这个新项目推送新版本,我的用户会将他们的应用更新到最新版本,然后它会崩溃,因为模型或型号版本号不匹配。

我不是在谈论在同一个应用程序中向数据模型添加新版本。我明白这个过程。这是关于将现有数据模型从旧项目移动/导入/等到新项目。

我应该只复制文件并手动将它们添加到我的项目中吗?我是否需要更改构建设置中的内容以解释它?

3 个答案:

答案 0 :(得分:11)

最后,我就是这样解决的:

  1. 使用CoreData创建新项目
  2. 将原始CoreData模型文件复制到我的新项目中。将其添加到项目中。
  3. 删除新项目自动处理的空CoreData模型。
  4. 在项目设置中,在Build Phases,Compile Sources下,我添加了复制的CoreData模型文件。
  5. 然后我使用了Scott上面提供的代码:

    [NSManagedObjectModel mergedModelFromBundles:nil]
    

    自动查找所有模型并将它们组合在一起。通过删除自动生成的一个并添加我传输的一个,然后一切正常。

答案 1 :(得分:2)

只要您保留相同的应用程序标识符,您的新代码将替换已安装用户的二进制文件,同时保持其所有数据不受影响。所以你的新项目基本上是作为一个新的二进制交换。在此之后,您可以确保加载正确的.sqlite文件,处理升级等。

让我进一步编辑。 Downvote很伤心。

有一个ZMETADATA表(或同等的,现在无法达到),它具有识别事物所需的所有信息。此外,还有哈希来了解当前版本是否存在以便可以进行自动迁移。如果哈希存在,并且您已通过[[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:modelPath]]而不是[NSManagedObjectModel mergedModelFromBundles:nil]加载模型,那么一切都应该很好。

答案 2 :(得分:-1)

我找到了一种更简单的方法。我创建了一个包含核心数据的新项目,然后关闭它而不构建或运行它。然后我使用IDE打开xcdatamodeld。文本编辑器可能也可以正常工作。我不得不深入研究内容。这可能是因为我正在使用PHPStorm并且它正试图通过这个来创建一个项目。我想编辑的文件如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0"   lastSavedToolsVersion="1" systemVersion="11A491" minimumToolsVersion="Automatic"   sourceLanguage="Swift" userDefinedModelVersionIdentifier="">
</model>

然后我打开了源xcdatamoleld并将模型标记之间的所有内容复制到新文件中。我关闭了文件并构建了项目。我没有复制实际的模型数据(.storedata)。

一个警告:在我的原始项目中,我不断更改模型并删除模型数据。 Xcode无法处理它并抛出各种错误。我最后一次这样做,我得到了警告:

CoreData: warning: Unable to load class named 'Performance' for entity 'Performance'.  Class not found, using default NSManagedObject instead.

此警告在新项目中重新出现,因此模型定义中存在错误。幸运的是,它不会导致执行任何问题。如果你没有这个警告,你可能没事。

这是Xcode 8.2.1,它是一个Swift项目。