用途:指导在 SwiftData 中实现自定义架构迁移,使用 VersionedSchema 描述各版本模型,用 SchemaMigrationPlan 组织迁移阶段。要求 iOS 17+、Swift 5.9+;部分特性如 propertiesToFetch 面向 iOS 26+。
主要能力:区分可自动完成的轻量迁移(新增可选属性、带默认值的必填属性、删除属性、配合 @Attribute(originalName:) 重命名、修改关系删除规则、新增模型)与需自定义迁移的场景(属性类型变更、可选改必填、复杂关系重构、数据拆分合并、加唯一约束前去重)。
关键约束:willMigrate 只能访问旧模型,didMigrate 只能访问新模型,无法在同一阶段同时存取新旧模型,因此类型变更需借助中间版本的两阶段迁移:先加新属性、再转换数据并移除旧属性。每个 VersionedSchema 是完整快照,未变化的模型也需一并列出。多对多关系必须显式声明 inverse 且两侧为数组,需注意 iOS 17.0 按字母序命名的缺陷,17.1+ 已修复;如需关系元数据可用中间关联模型。迁移中可用 relationshipKeyPathsForPrefetching 预取关系以避免 N+1 查询。
使用方式:定义各版本枚举与模型,声明 SchemaMigrationPlan 的 schemas 与 stages,用 lightweight 或 custom 阶段实现;在 ModelContainer 初始化时传入 migrationPlan。调试常见错误包括架构版本不匹配提示。
适用场景与限制:适合有既有用户数据需要升级的 SwiftData 应用。需注意模拟器成功不代表真机安全,建议用真实设备上的现有数据验证;技能未提供具体收费、价格等信息。