Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 第6章:Schema 和版本迁移

第6章:Schema 和版本迁移

版本控制与数据模型的演进

1. 数据模型版本化的必要性

在应用的生命周期中,数据模型会随着需求变化而演进。版本控制允许你:

  • 保留旧数据模型的兼容性
  • 支持增量式功能迭代
  • 确保用户数据在升级时不会丢失

2. 创建模型版本

在Xcode中操作步骤:

  1. 选择.xcdatamodeld文件
  2. 点击菜单栏 Editor > Add Model Version...
  3. 输入新版本名称(如 MyAppModelV2)
  4. 选择基于哪个旧版本创建
// 配置ModelContainer时指定版本
let container = try ModelContainer(
    for: MyAppModelV2.self,
    migrationPlan: MyMigrationPlan.self
)

3. 迁移策略选择

策略类型适用场景特点
自动轻量级迁移简单属性变更系统自动处理
自定义迁移复杂结构变化需要实现SchemaMigrationPlan
手动迁移极端特殊情况完全控制迁移过程

4. 实现自定义迁移计划

enum MyMigrationPlan: SchemaMigrationPlan {
    static var schemas: [VersionedSchema.Type] = [
        MyAppModelV1.self,
        MyAppModelV2.self
    ]
    
    static var stages: [MigrationStage] = [
        // 第一阶段迁移
        migrateV1toV2
    ]
    
    static let migrateV1toV2 = MigrationStage.custom(
        fromVersion: MyAppModelV1.self,
        toVersion: MyAppModelV2.self,
        willMigrate: { context in
            // 迁移前准备
        }, 
        didMigrate: { context in
            // 迁移后处理
        }
    )
}

5. 测试迁移流程

关键测试要点:

  • 使用旧版本应用生成测试数据
  • 升级到新版本验证数据完整性
  • 测试回滚场景(如迁移失败时)
// 测试代码示例
func testMigration() throws {
    let oldStoreURL = // 旧版本数据库路径
    let config = ModelConfiguration(url: oldStoreURL)
    let container = try ModelContainer(
        for: CurrentModel.self,
        configurations: config
    )
    // 验证迁移后数据
}

6. 版本演进的最佳实践

  1. 增量修改:每次只做最小必要变更
  2. 保留旧版本:至少保留最近2-3个旧版本
  3. 文档记录:记录每个版本的变更内容
  4. 兼容性考虑:确保新版本能处理旧数据
  5. 用户通知:重大变更时提供升级说明

7. 常见问题解决方案

问题1:迁移后属性值为nil

  • 检查是否在模型中正确设置了默认值
  • 验证didMigrate闭包中是否漏掉数据处理

问题2:迁移性能差

  • 对大数据库分批处理迁移
  • 考虑在后台线程执行迁移

问题3:测试覆盖率不足

  • 为每个迁移路径编写测试用例
  • 包含边界情况测试(如空数据库迁移)
Last Updated:: 5/30/25, 5:48 PM