SuperAPI AI 工具集

axiom-swiftdata-migration

数据与分析

查看项目

更新于 10-16 00:23

技能介绍

用途:指导在 SwiftData 中编写自定义 schema 迁移。适用 iOS 17+、Swift 5.9+,部分特性面向 iOS 26+。

核心限制:willMigrate 只能访问旧模型,didMigrate 只能访问新模型,无法同时访问两者,所有迁移策略都受此约束。

自动(轻量)迁移可处理:新增可选属性、新增带默认值的必填属性、删除属性、用 @Attribute(originalName:) 重命名属性、修改关系删除规则、新增模型。需要自定义迁移的场景:修改属性类型、把可选属性改为必填、复杂关系重构、数据转换(拆分/合并字段)、添加唯一约束时的去重。

主要模式:

  1. 每个 schema 版本定义为 VersionedSchema,包含全部模型(含未变更的),使用 Schema.Version(major, minor, patch) 做语义版本,并显式写 init、双向关系指定 inverse。
  2. 类型变更用两阶段迁移:先加中间版本同时保留新旧属性,再做自定义迁移转换数据,最后移除旧属性(如 String → AttributedString)。
  3. 多对多关系必须显式指定 inverse,两端均为数组且给默认值;iOS 17.0 存在字母顺序命名 bug,给关系数组默认值可规避,17.1+ 修复。需要关系附加字段时使用显式中间模型。
  4. 迁移时用 relationshipKeyPathsForPrefetching 预取关系,避免 N+1;iOS 26+ 可用 propertiesToFetch。
  5. 属性重命名用 @Attribute(originalName:) 走轻量迁移。
  6. 添加 @Attribute(.unique) 前需先做去重。

使用方式:定义 NotesMigrationPlan 实现 SchemaMigrationPlan 的 schemas 与 stages,在 App 中用 Schema(versionedSchema:) 与 ModelContainer(for:migrationPlan:) 应用;命令与代码保持原样。

限制:资料未提供官方收费、价格、平台与效果信息;强调需在真机用已有数据测试,模拟器通过不代表生产安全,并注意 schema 版本不匹配等错误。