0Pricing
Swift Academy · レッスン

軽量マイグレーションとCloudKit同期

スキーマの変更を移行し、NSPersistentCloudKitContainerでCloudKit同期を有効にします。

「軽量マイグレーションとCloudKit同期」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

なぜマイグレーションが必要ですか?

Core DataまたはSwiftDataのモデルで属性を追加、名前変更、削除すると、既存のストアをマイグレーションする必要があります。

// Without migration, app crashes on launch:
// "The model used to open the store is incompatible with the one used to create the store"

Core Dataの軽量マイグレーション

Core Dataは、マッピングモデルを使わずに、属性の追加、名前変更、削除などの単純なマイグレーションを自動的に推論できます。

let desc = NSPersistentStoreDescription(url: storeURL)
desc.shouldMigrateStoreAutomatically = true
desc.shouldInferMappingModelAutomatically = true
container.persistentStoreDescriptions = [desc]

.xcdatamodeldのバージョン履歴

Xcodeで新しいモデルバージョンを作成します:「Editor → Add Model Version」。新しいバージョンを現在のバージョンに設定します。

// In MyModel.xcdatamodeld:
// ├── MyModel.xcdatamodel  (v1 - old)
// └── MyModel 2.xcdatamodel (v2 - current)
// Set current version to v2 in File Inspector

SwiftDataのスキーマバージョン管理

VersionedSchemaとSchemaMigrationPlanを使用して、SwiftDataのモデルバージョンを管理します。

enum AppSchemaV1: VersionedSchema {
  static var versionIdentifier = Schema.Version(1,0,0)
  static var models: [any PersistentModel.Type] { [ItemV1.self] }
  @Model final class ItemV1 { var name: String; init(name: String) { self.name = name } }
}

SchemaMigrationPlan

SchemaMigrationPlanでバージョン間のマイグレーションステージを定義し、SwiftDataのアップグレードを指示します。

enum AppMigrationPlan: SchemaMigrationPlan {
  static var schemas: [any VersionedSchema.Type] { [AppSchemaV1.self, AppSchemaV2.self] }
  static var stages: [MigrationStage] { [migrateV1toV2] }
  static let migrateV1toV2 = MigrationStage.lightweight(fromVersion: AppSchemaV1.self, toVersion: AppSchemaV2.self)
}

カスタムマイグレーションステージ

複雑なマイグレーション(データ変換)には、willMigrateとdidMigrateのクロージャを持つ.customステージを使用します。

static let migrateV1toV2 = MigrationStage.custom(
  fromVersion: AppSchemaV1.self,
  toVersion: AppSchemaV2.self,
  willMigrate: { context in
    // transform old data
  },
  didMigrate: nil
)

NSPersistentCloudKitContainer

NSPersistentContainerをNSPersistentCloudKitContainerに置き換えて、CloudKit同期を有効にします。

let container = NSPersistentCloudKitContainer(name: "MyModel")
container.loadPersistentStores { _, error in
  if let error { fatalError("\(error)") }
}
container.viewContext.automaticallyMergesChangesFromParent = true

CloudKitの要件

CloudKit同期には、サインイン済みのiCloudアカウント、CloudKitエンタイトルメント、開発者ポータルで設定したCloudKitコンテナが必要です。

// Xcode: Signing & Capabilities → + → iCloud → CloudKit
// Enable "Use CloudKit" in Core Data model inspector

CloudKitとSwiftData

cloudKitDatabaseを指定したModelConfigurationを渡して、SwiftDataのCloudKit同期を有効にします。

let config = ModelConfiguration(
  schema: schema,
  cloudKitDatabase: .automatic
)
let container = try ModelContainer(for: schema, configurations: config)

同期コンフリクトへの対処

Core Data CloudKitは、last-write-winsポリシーを使ってコンフリクトを解決します。同時書き込みの競合を最小限に抑えられるようモデルを設計します。

// Best practice: keep models granular
// One attribute per write concern
// Avoid large blobs that frequently change

マイグレーションのテスト

ユーザーに影響が及ぶ前に問題を見つけられるよう、リリース前に本番ストアのコピーでマイグレーションをテストします。

// Copy production store to a temp location
// Load it with the new container and verify objects are intact

マイグレーションの監視

Core Dataのマイグレーション通知を監視し、時間のかかるマイグレーション中に進行状況UIを表示します。

NotificationCenter.default.addObserver(
  forName: .NSPersistentStoreCoordinatorStoresWillChange,
  object: container.persistentStoreCoordinator,
  queue: .main
) { _ in showMigrationProgress() }

確認問題

CloudKitとの自動同期を有効にするNSPersistentContainerのサブクラスはどれですか?

レッスンのまとめ

単純な変更にはshouldMigrateStoreAutomaticallyを使って軽量マイグレーションを有効にします。SwiftDataではVersionedSchemaとSchemaMigrationPlanを使用します。NSPersistentCloudKitContainerに置き換えるか、ModelConfiguration(cloudKitDatabase: .automatic)を使ってCloudKit同期を有効にします。

よくある質問

「軽量マイグレーションとCloudKit同期」レッスンは無料ですか?

はい。「軽量マイグレーションとCloudKit同期」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「軽量マイグレーションとCloudKit同期」で何を学びますか?

スキーマの変更を移行し、NSPersistentCloudKitContainerでCloudKit同期を有効にします。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「軽量マイグレーションとCloudKit同期」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Core Dataスタック:NSPersistentContainerの設定
  2. SwiftDataの@ModelとModelContext
  3. リレーションシップとFetch Descriptor
  4. 軽量マイグレーションとCloudKit同期
← Swift Academyに戻る