核心数据:仅添加或重命名一个属性时仍会发生迁移?

时间:2013-12-20 02:58:59

标签: ios iphone core-data core-data-migration

正如标题所说,我只是添加或重命名一个实体的一个属性。因此,当用户升级到新版本does Core Data have to read all the existing data into memory and write into the destination store?

对于数据模型的一个小变化来说,这是一个太大的代价。

还有一个问题:Can I use lightweight migration or custom migration dynamically according to the filesize of persistent store?如果数据库太大,我会运行自定义迁移以避免内存警告,否则我选择轻量级以获得更好的用户体验。

这些让我很困惑。感谢您的任何提示。

自定义迁移的好链接:

example

another example

1 个答案:

答案 0 :(得分:4)

  1. 更改一个属性将导致迁移
  2. 重命名属性将被“猜测”通过轻量级迁移作为已删除的属性,然后添加属性;有效删除属性中的值。
  3. 我不建议过重的迁移;它太贵了。通常更快地导出到另一种格式,然后再读回来。

    我会考虑不重命名属性,只是添加新属性,然后在-awakeFromFetch中将数据从旧属性移动到新属性。

    或者不重命名属性,重命名的代码原因是什么?

    更新1

    是的,您可以就迁移做出决定。为此,您询问商店是否需要迁移。通过调用-[NSManagedObjectModel isConfiguration:compatibleWithStoreMetadata:],您可以确定是否需要迁移。然后,您可以从中确定文件大小并做出决定。

    但是,我不会进行自定义迁移。还有其他选择:

    如果您确实需要重命名该属性,请考虑以下事项:

    1. 检查迁移情况
    2. 迁移到新属性名称​​已添加的中间版本。
    3. 浏览数据并将值从旧属性复制到新
    4. 迁移到删除旧属性的最终模型。
    5. 我愿意打赌,这比自定义迁移更快,因为只有一个数据副本驻留,所以它会占用更少的内存。

      真的不喜欢iOS上的重量级迁移:)

      更新2

      感谢Alexei Kuznetsov的评论;您可以在要重命名的属性上将重命名ID设置为属性的原始名称,轻量级迁移应正确迁移数据。当然,我建议对此进行测试,以确保没有任何意外。