gpt4 book ai didi

ios - Swift - Coredata Migration - 根据旧属性值设置新属性值

转载 作者:IT王子 更新时间:2023-10-29 05:38:44 24 4
gpt4 key购买 nike

我当前的核心数据实体之一 - Entity1 - 有一个名为 isSavedBoolean 属性。

在新的核心数据模型中,我计划删除 isSaved 属性并添加一个名为 type 的新 Int 属性。对于所有保存的 Entity1 对象,我想根据旧核心数据模型中 isSaved 的值设置 type 的值。 (例如,如果 isSaved 为真,则类型为 1,否则类型为 2)。

我已经阅读了一些关于轻量级核心数据迁移的文章,但它们似乎都没有帮助。

只是想知道是否有任何方法可以使我计划的迁移成功?

最佳答案

轻量级迁移做不到这一点。您必须创建映射模型和 NSEntityMigrationPolicy 的子类.这并不困难,但对于大多数 iOS 开发人员来说,这是一个陌生的领域。步骤是这样运行的:

  1. 创建映射模型。在 Xcode 中,文件 --> 新建 --> 映射模型。当您单击“下一步”时,Xcode 将要求提供此映射的源(旧)和目标(新)模型文件。
  2. 模型文件将在可能的情况下推断映射。其他一切都将是空白的。用你的type和其他一些属性,它看起来像下面这样。类似 $source.timestamp 的条目意味着从迁移之前复制现有值。

Initial mapping

  1. 创建NSEntityMigrationPolicy 的新子类.给子类一个明显的名字,比如 ModelMigration1to2 .这个类将告诉 Core Data 如何将旧的 bool 值映射到新的整数值。

  2. 给子类添加一个方法来转换值。像下面这样的东西。方法名称无关紧要,但如果您选择描述性的名称就好了。您需要在此处使用 ObjC 类型——例如NSNumber而不是 IntBool .

     @objc func typeFor(isSaved:NSNumber) -> NSNumber {
    if isSaved.boolValue {
    return NSNumber(integerLiteral: 1)
    } else {
    return NSNumber(integerLiteral: 2)
    }
    }
  3. 返回映射模型并告诉它使用您的子类作为其自定义映射策略。这是在“自定义策略”下右侧的检查器中。请务必包含模块名称和类名称。

Custom Policy

  1. 告诉映射模型使用您之前创建的函数来获取 type 的值旧属性(property)isSaved属性(property)。下面说在名为 typeForIsSaved: 的自定义策略类上调用一个函数(: 很重要)有一个参数,并且该参数应该是 isSaved $source 上的值(旧的托管对象)。

Custom attribute mapping

迁移应该现在可以工作了。您不必告诉 Core Data 使用映射模型——它会发现需要迁移并寻找与新旧模型版本匹配的模型。

一些注意事项:

  • 如果您因类似 Couldn't create mapping policy for class named... 的错误而崩溃那么你在第 5 步中忘记了上面的模块名称(或者弄错了)。
  • 如果您遇到 unrecognized selector 崩溃错误,那么第 4 步中的方法签名与您在第 6 步中输入的内容不匹配。如果您忘记包含 @objc,也会发生这种情况。在函数声明中。

关于ios - Swift - Coredata Migration - 根据旧属性值设置新属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40647764/

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