首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS8.1核心-数据轻量级+重量级迁移

iOS8.1核心-数据轻量级+重量级迁移
EN

Stack Overflow用户
提问于 2014-11-19 17:26:03
回答 1查看 3K关注 0票数 2

我有我的核心数据数据库的第一版。(减少的例子)

我对模型做了一些修改,制作了V2。这涉及到创建一个新的实体,其中包含类型属性和其他几个。type属性是指向板块实体的链接。

我的应用程序的新版本已经发布,数据可以迁移,因为这是轻量级的。当时出于我自己的原因,我当时没有建立一种关系。

稍后,我决定对结构做一些更大的更改,创建新的实体FixtureType和PlateTypeImage。然后我建立了一些关系。这给了我模型的V3。

由于这种修改的性质,我需要完成从V2到V3的重量级迁移,这涉及到复制属性数据、填充新属性和在执行过程中设置关系。因此,我建立了一个映射模型,创建了必要的迁移策略并按下go按钮。

这适用于V2到V3,但是在测试从V1到V3的迁移时,我得到了一系列错误.,例如

reason=Cannot就地迁移存储:验证错误,缺少强制目标关系上的属性值

我使用以下PSC选项:

代码语言:javascript
复制
NSDictionary *options = @{
                          NSMigratePersistentStoresAutomaticallyOption : @YES,
                          NSInferMappingModelAutomaticallyOption : @YES
                          };


if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {

所以,我的问题是核心数据是如何迁移数据的?它是顺序的,所以我得到了从V1到V2的轻量级迁移,然后是重量级的V2到V3,还是从V1到V3的迁移?如果是这样的话,我是否需要为V1到V3创建一个迁移策略(很快就会使事情变得难以处理以涵盖每一个组合)?

而且,一旦我开始使用重量级,我是否失去了轻量级迁移工具?

感谢您的建议和评论。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-19 18:51:33

核心数据版本控制不是时态的。它只知道来源和目的地。因此,一旦您引入一个新模型,您就需要从以前的所有模型到当前模型进行测试。

如果添加V4,则需要测试以下内容:

V1->V4

V2->V4

V3->V4

因此,如果您的V4需要大量迁移,那么您需要为做一个映射--每个可能的迁移。

我的一般性建议是不惜一切代价避免大量移民。它们不是针对iOS而设计的,并且经常引发问题。有些替代方案会表现得更好。

更好的方法

我使用的两种最常见的代替大量迁移的方法是

  1. 进出口。为此我使用JSON。它在内存上更容易,因此可以避免由于内存限制而崩溃。
  2. 聪明的前后迁移代码。例如,如果要将数据拆分到一个新对象,需要进行大量迁移,则可以创建新对象并将数据保留在旧对象中。这将把它变成一个轻量级的迁移。在那里,您可以监视迁移,然后在迁移完成后手动移动数据。然后,您甚至可以进行另一次轻量级迁移,迁移到不包括即将被删除的属性的最终模型。

请记住,iCloud不允许大量迁移,因此如果要考虑使用iCloud,则必须跳过大量迁移。这也是一个非常强烈的迹象,表明苹果正在放慢步伐,放弃大规模迁移,并将其作为“最后手段”。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27023121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档