Swift 定制 Core Data 迁移
内容提要
本文介绍了在应用程序开发过程中,如何使用Core Data迁移来保持数据的一致性和完整性。首先解释了什么是Core Data迁移,以及为什么需要进行迁移。然后通过一个示例应用程序详细介绍了如何更新数据模型,添加新实体和关系,以解决现有模型的可扩展性问题。接下来介绍了如何创建映射模型来定义不同模型版本之间的映射关系,并演示了如何编写自定义迁移策略来处理特定情况,例如将旧模型数据迁移到新模型的新关系中。最后,通过将自定义迁移策略添加到映射模型中,完成了整个迁移过程。
延伸解读
为何需要自定义迁移策略
文章示例中,旧模型将艺术家名称和原始 JSON 直接存储在 Track 实体中,导致可扩展性差。新模型引入 Artist 实体并建立多对多关系,这属于结构变化,Core Data 无法自动推断映射。因此,必须手动创建映射模型并编写自定义迁移策略,才能将旧数据正确迁移到新关系,避免数据丢失。
迁移策略中的关键处理逻辑
自定义迁移策略继承 NSEntityMigrationPolicy,并重写 createDestinationInstances 方法。代码先复制源实体属性,再解析 json 字段获取艺术家列表。为避免重复,会先查询目标上下文中是否已存在同名艺术家,若不存在则创建新 Artist 实体并设置属性,最后将艺术家集合关联到目标 Track 实例。
配置注意事项与迁移方式选择
示例中 CoreDataStack 设置了 shouldMigrateStoreAutomatically 为 true,同时将 shouldInferMappingModelAutomatically 设为 false。这意味着存储会自动迁移,但不会自动推断映射模型,因此每个迁移都必须提供映射模型文件。文章也提到,这种非渐进式迁移比渐进式迁移更简单快速,但需要手动处理映射细节。
Q&A
Core Data 迁移的主要目的是什么?
Core Data 迁移的主要目的是将数据模型从一个版本更新到另一个版本,以适应数据结构的变化,确保数据的一致性和完整性。
如何创建新的模型版本以支持数据迁移?
可以通过选择 .xcdatamodeld 文件,然后从菜单栏中选择 Editor > Add Model Version... 来创建新的模型版本,并以第一个模型版本为基础。
在 Core Data 迁移中,为什么需要手动创建映射模型?
因为在某些情况下,Core Data 不允许自动推断映射模型,所以需要手动创建映射模型文件来定义不同模型版本之间的映射关系。
如何编写自定义迁移策略以处理特定情况?
可以通过创建一个继承自 NSEntityMigrationPolicy 的新类,并在其中实现数据迁移的逻辑来编写自定义迁移策略。
示例应用程序中 Track 实体的主要特点是什么?
Track 实体的主要特点包括 imageURL、lastPlayedAt、title 和 artists,其中 artists 是一个对多的关系,支持多个艺术家。
在数据迁移过程中,如何确保旧数据正确迁移到新模型中?
通过编写自定义迁移策略,明确如何将旧模型的数据映射到新模型的结构中,确保数据的正确迁移。