不同模型之间的核心数据迁移?

Posted

技术标签:

【中文标题】不同模型之间的核心数据迁移?【英文标题】:Core Data Migration Between Different Models? 【发布时间】:2014-04-18 14:28:20 【问题描述】:

处理一个存在大量问题和大量未使用/有缺陷的遗留代码的 xcode 项目 - 我们最近决定重新开始一个新项目并从那里开始构建。一切都好得多,但我遇到了核心数据迁移问题。

这个模型的绝大多数是相同的,只是做了一些调整——这个模型只包含 6 个对象,而且我真正关心的只有一个对象,我真正关心的是获取用户保存的内容,所以当我们发布这个并且他们升级该数据时有没有。我在新项目中基本上从头开始创建了新模型,所以我猜测应用程序正在尝试基于 ID 或不匹配的东西访问特定模型?

有人知道潜在的解决方案吗?

应用程序在以下断言处崩溃:

NSPersistentStore *persistentStore = [managedObjectStore addSQLitePersistentStoreAtPath:storePath fromSeedDatabaseAtPath:nil withConfiguration:nil options:options error:&error];

NSAssert(persistentStore, @"Failed to add persistent store with error: %@", error);

现有应用目前在其原始 ModelA 的第二个版本上,而新应用在第一个版本上只有一个全新的 ModelA。我猜这可能与它有关?

【问题讨论】:

该项目需要同时包含旧模型和新模型才能进行迁移。它检查现有版本的捆绑包并尝试创建映射模型(假设您正在使用轻量级迁移)。如果您不使用轻量级迁移,则需要一个映射模型。否则,它将不知道如何迁移您的内容。 有趣 - 我如何处理两个对象文件,如 foo.h 和 foo.m,它们具有相同的名称和模型之间可能不同的属性? 我应该更清楚一点:我所说的旧模型是指 .xcdatamodeld 文件中的模型。您必须将该文件添加到新项目中,然后在其中添加该数据模型的新版本。 好的,太好了!最好的方法是什么?我可以在 xcode 中单击并将 .xcdatamodel 从一个项目拖到另一个项目吗? 你在新项目中使用 RestKit 吗? 【参考方案1】:

我正要评论,但我的回复太长了......

首先是一个愚蠢的问题......我写这个从来没有使用过RestKit......

问题一 - 是否值得在新项目中检查 RestKit 所需的构建设置?

问题二 - 您不应该在方法中包含 fromSeedDatabaseAtPath 的值吗?

等待对问题一的满意答复,试试这个...

第一;在 Xcode 中关闭您的新项目。打开 Finder 窗口,并使用 Finder 将旧项目中的旧 .xcdatamodeld 文件复制到新项目目录/文件夹中,并根据需要重命名文件名。

第二;打开 Xcode,在您的新项目中,选择 File 菜单中的“Add Files to Project...”选项,然后按照提示将旧的 .xcdatamodeld 文件添加到您的项目中。

第三;在您的代码中,创建一个NSString 来表示旧.xcdatamodeld 文件的路径,并将其包含在fromSeedDatabaseAtPath: 之后的代码行中,用于方法addSQLitePersistentStoreAtPath:fromSeedDatabaseAtPath:withConfiguration:options:error:

这有帮助吗?

【讨论】:

感谢您的回复。我不确定您对问题一的具体意思-RestKit 对项目来说并不新鲜,所以我认为这不是构建设置问题。我已经使用 restkit 大约 6 个月了,对象模型的多个版本没有问题。 我遇到同样的问题:Error Domain=NSCocoaErrorDomain Code=134140 “操作无法完成。(Cocoa 错误 134140。)” UserInfo=0x15defec0 reason=找不到或自动推断迁移映射模型, 另外,我需要从旧模型生成目标文件,还是应用程序只需要旧模型本身? @Mike 这是一个愚蠢的问题...我以前没有使用过 RestKit,所以这是我试图彻底并可能引发对可能丢失的设置的思考。 我之前遇到过Code=134140...我怀疑在您的情况下它将是“找不到...”。是的,您需要向 Core Data 提供在应用程序中完成该过程所需的所有元素,这意味着新旧模型文件都需要包含在新应用程序的编译源下的构建阶段中。为清楚起见,这包括作为单独的.xcdatamodeld 文件的旧模型,在方法中引用为NSString 路径,针对fromSeedDatabaseAtPath,以及新的.xcdatamodeld 文件,引用为NSString 路径,针对addSQLitePersistentStoreAtPath .【参考方案2】:

我最终进行了自己的重量级迁移。我将旧数据模型添加到新项目中,并将旧对象一次性迁移到新对象,并将它们存储在新数据库中。

【讨论】:

以上是关于不同模型之间的核心数据迁移?的主要内容,如果未能解决你的问题,请参考以下文章

在非连续版本之间迁移时出现核心数据迁移错误

我应该如何迁移我的核心数据?

核心数据迁移:无法将“NSManagedObject_MyType”类型的值转换为“MyModule.MyType”

核心数据模型迁移

迁移复杂的核心数据模型

核心数据迁移问题:“持久存储迁移失败,缺少源托管对象模型。”