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

标签 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

最佳答案

  • 更改一个属性将导致迁移
  • 通过轻量级迁移将“猜测”属性重命名为已删除的属性,然后是添加的属性;有效删除属性中的值。

  • 我不建议您进行大量迁移。它太昂贵了。仅导出为另一种格式然后再读回它通常会更快。

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

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

    更新1

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

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

    如果您确实需要重命名该属性,请考虑以下事项:
  • 检查迁移情况
  • 迁移到添加了新属性名称的中间版本。
  • 遍历数据并将值从旧属性复制到新
  • 迁移到删除旧属性的最终模型。

  • 我愿意打赌,这将比自定义迁移更快,并且由于只驻留一个数据副本,因此它将消耗更少的内存。

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

    更新2

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

    关于ios - 核心数据:仅添加或重命名一个属性时,迁移仍会发生吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20695589/

    相关文章:

    ios - 如何以模态方式呈现透明的 UINavigationController + root?

    iPhone NavigationController - 推送相同的 View ,接收不同的布局

    iphone - arrayWithContentsOfFile 无法读取 plist 文件

    iphone - 如何在 iPad 中自动旋转期间重新排列 View

    ios - 为什么更改实体的属性时我的 CoreData 信息会被删除?

    ios - 从提取请求返回的对象有不正确的数据

    Objective-C 如何将数组放入数组中

    ios - 为什么多重采样不起作用?

    ios - Xcode 目标 : Images from main target not loading in test target

    ios - 核心数据警告