我有一个旧的Xcode项目,其中包含一个CoreData模型(包含模型的版本1和版本2)。出于几个原因,我需要创建一个新的Xcode项目并将所有代码传输到新项目。
如何以这样的方式导入/传输我的旧CoreData模型:这个新的二进制文件仍然能够读取并可能迁移现有用户的iPhone和iPad上的现有CoreData存储库?我担心,如果我使用这个新项目推送新版本,我的用户会将他们的应用更新到最新版本,然后它会崩溃,因为模型或型号版本号不匹配。
我不是在谈论在同一个应用程序中向数据模型添加新版本。我明白这个过程。这是关于将现有数据模型从旧项目移动/导入/等到新项目。
我应该只复制文件并手动将它们添加到我的项目中吗?我是否需要更改构建设置中的内容以解释它?
答案 0 :(得分:11)
最后,我就是这样解决的:
然后我使用了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项目。