gpt4 book ai didi

iOS8.1 Core-Data轻量级+重量级迁移

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:27:04 24 4
gpt4 key购买 nike

我有核心数据数据库的版本 1。 (简化示例)

enter image description here

我对模型进行了一些更改,制作了 V2。这涉及创建一个具有 type 属性和其他一些属性的新实体。 type 属性是指向 plate 实体的链接。 enter image description here

我的应用程序的新版本已发布,数据迁移正常,因为它是轻量级的。由于当时我自己的原因,此时没有建立关系。

一段时间后,我决定对结构做一些更大的更改,创建新实体 FixtureTypePlateTypeImage。然后我创建一些关系。这为我提供了模型的 V3。

enter image description here

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

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

reason=Cannot migrate store in-place: Validation error missing attribute values on mandatory destination relationship

我正在使用以下 PSC 选项:

NSDictionary *options = @{
NSMigratePersistentStoresAutomaticallyOption : @YES,
NSInferMappingModelAutomaticallyOption : @YES
};


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

那么,我的疑问是 core-data 是如何迁移数据的?它是按顺序进行的,所以我得到了从 V1 到 V2 的轻量级迁移,然后是重量级 V2 到 V3,还是从 V1 到 V3 的迁移?如果是这样,我是否需要为 V1 到 V3 创建一个迁移策略(使事情很快变得笨拙以涵盖每个组合)?

此外,一旦我开始使用重量级,我现在是否失去了轻量级迁移工具?

建议和意见表示赞赏。

最佳答案

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

如果添加 V4,则需要测试:

V1->V4
V2->V4
V3->V4

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

我的一般建议是不惜一切代价避免大量迁移。它们不是为在 iOS 上工作而设计的,并且经常会导致问题。有一些性能更好的替代方案。

更好的方法

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

  1. 导出/导入。我为此使用 JSON。它更容易占用内存,因此可以避免由于内存限制而导致的崩溃。

  2. 巧妙的迁移前后代码。例如,如果您将数据拆分到一个新对象,这需要大量迁移,您可以创建新对象并将数据保留在旧对象中。这会将其变成轻量级迁移。从那里您可以观察迁移,然后在迁移完成后手动移动数据。然后,您甚至可以执行另一个轻量级迁移到不包含即将删除的属性的最终模型。

请记住,iCloud 不允许大量迁移,因此如果您打算使用 iCloud,则必须跳过大量迁移。这也是一个非常有力的指标,表明 Apple 正在放慢弃用大量迁移的步伐,并将其保留为“最后手段”策略。

关于iOS8.1 Core-Data轻量级+重量级迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27023121/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com