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

Posted

技术标签:

【中文标题】核心数据:仅添加或重命名一个属性时仍会发生迁移?【英文标题】:Core Data : migration still happens when just adding or renaming only one property? 【发布时间】:2013-12-20 02:58:58 【问题描述】:

正如标题所说,我只是添加或重命名一个实体的一个属性。所以,当用户升级到新版本时,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】:
    更改一项属性将导致迁移 将通过轻量级迁移“猜测”重命名属性作为已删除的属性,然后是添加的属性;有效地删除属性中的值。

我不建议进行大量迁移;它太贵了。将其导出为另一种格式然后重新读取通常会更快。

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

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

更新 1

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

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

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

    检查迁移情况 迁移到添加了新属性名称的中间版本。 遍历您的数据并将值从旧属性复制到新属性 迁移到删除旧属性的最终模型。

我敢打赌,这将比自定义迁移更快,并且消耗的内存要少得多,因为只有一个数据副本是常驻的。

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

更新 2

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

【讨论】:

Zarra Soooo 很高兴看到你的回答,我已经听到你的名字很久了。并感谢您的回答。我真正的问题是一些用户拥有非常大的数据集,而我的应用程序在迁移时内存不足。所以我现在正在考虑使用自定义迁移来处理大型数据集。 所以我添加第二个问题:Can I use lightweight migration or custom migration dynamically according to the filesize of persistent store? 在重命名属性并使用重命名标识符时,轻量级迁移不会将其视为“删除和添加”,而是允许重命名属性并保留数据,对吧? 一个很好的建议@Alexei Kuznetsov!老实说,我以前没有遇到过那个小宝石。 Apple 文档中的一些快速研究证实它应该有效。 Jason Lee,你应该试一试。 那么,@MarcusS.Zarra 除了自定义迁移之外,当轻量级迁移耗尽内存时,您还有其他解决方案吗?

以上是关于核心数据:仅添加或重命名一个属性时仍会发生迁移?的主要内容,如果未能解决你的问题,请参考以下文章

核心数据轻量级迁移属性重命名

在Access 2010中运行追加查询时出现“表已存在”错误

Oracle 12C 新特性之在线重命名迁移活跃的数据文件

将属性更改为不再是瞬态的 - 我可以通过轻量级核心数据迁移来做到这一点吗?

核心数据迁移删除实体数据

为第三方应用程序模板标签重命名/添加前缀?