Core DataはAppleのデータ管理フレームワークで、iOS、macOS、tvOS、watchOS向けのオブジェクトリレーショナルマッピングを提供します。SQLite、XML、またはバイナリストレージ上で動作し、アプリケーション内のオブジェクトの保存、取得、フィルタリングを自動化します。Apple Core Data Documentationによると、このフレームワークはManaged Object ContextとNSPersistentContainerの概念を使用して永続化スタックを管理します。
重要なポイント
Core DataはCocoa Touchの一部であるオブジェクトグラフおよび永続化管理フレームワークです。一般的な誤解に反して、Core Dataはデータベースではなく、SQLiteをストアの一つとして使用できるオブジェクト管理層です。Core Dataの主な役割は、オブジェクトの変更を追跡し、そのライフサイクルを管理し、ディスクとの状態を同期することです。
このフレームワークはオブジェクトグラフを提供し、各Managed Objectはコンテキストによって変更が追跡されます。保存時には、変更、追加、削除されたすべてのオブジェクトが単一のトランザクションで永続ストアにコミットされます。これにより、開発者はSQLクエリを記述したり、手動でトランザクションを管理したりする必要がなくなります。
Swift Developer Survey(2025)の統計によると、Core Dataはローカルデータを扱うiOSアプリケーションの52%で使用されています。SwiftDataやRealmといった最新の代替手段が登場したにもかかわらず、Core Dataはその成熟度とシステムとの深い統合により、既存のAppleプロジェクトで主要なフレームワークであり続けています。
Core Dataは、オブジェクト間の関係、変更のロールバック、faultingメカニズムによる自動キャッシングが必要な、中程度の複雑さのデータモデルを持つプロジェクトに使用してください。
Core DataのアーキテクチャはManaged Object Contextの概念を中心に構築されています。これはすべてのオブジェクト変更を追跡するワークスペースです。コンテキストは組み込みのNSUndoManagerによる元に戻す/やり直しをサポートしており、状態のスナップショットを手動で保存せずにドラフトやアクションのキャンセルを実装できます。save()を呼び出すと、コンテキストはすべての変更を単一のトランザクションで永続ストアにコミットし、データの原子性と一貫性を保証します。
Core Dataのデータモデルは.xcdatamodeldファイルで定義されます。これはXcodeのビジュアルエディタで、すべてのEntity、その属性、リレーションシップが記述されます。コンパイル時にモデルは.momdにシリアライズされ、NSManagedObjectModelを介してロードされます。
Entityはデータ型の記述であり、SQLのテーブルに似ています。各EntityにはAttributesのセット(String、Integer、Date、Boolean、Data型の名前付きフィールド)が含まれます。Roomとは異なり、Core Dataではモデルエディタを介して各属性に明示的な型選択が必要です。
RelationshipはEntity間の接続であり、SQLの外部キーに似ています。Core Dataはすべてのタイプのリレーションシップ(1対1、1対多、多対多)をサポートしています。各リレーションシップにはDelete Rule(Cascade、Nullify、Deny)が設定され、関連オブジェクトが削除されたときの動作を定義します。
| Delete Rule | 削除時の動作 | 使用例 |
|---|---|---|
| Cascade | 関連するすべてのオブジェクトを削除 | アイテムごと注文を削除 |
| Nullify | 逆リレーションシップをnullに設定 | 本を削除せずに著者を削除 |
| Deny | 関連オブジェクトが存在する場合、削除をブロック | 商品のあるカテゴリの削除を防止 |
Delete Ruleの選択はデータの整合性にとって重要です。Cascadeは確認なしでデータベースの3分の1を削除する可能性があり、Denyは不明瞭なエラーで操作をブロックする可能性があります。本番コードでは、手動の孤立レコード処理とともにNullifyが推奨されます。
Xcodeのモデルエディタでは、開発者はEntityと属性だけでなく、constraints(一意制約)、クエリ高速化のためのインデックス、属性のデフォルト値も定義できます。すべてのモデル変更は.momdファイルにコンパイルされ、NSPersistentContainerの初期化時にロードされます。モデルバージョニング(Model Versioning)により、複数のスキーマバージョンを維持し、それらの間でマイグレーションを実行できます。
NSPersistentContainerはiOS 10およびmacOS 10.12以降、Core Dataスタックを管理する単一のオブジェクトです。NSManagedObjectModel、NSPersistentStoreCoordinator、NSManagedObjectContextをカプセル化し、モデルのロードとストア設定を自動化します。古いバージョンではスタックは手動で構築されていましたが、現在は推奨されていません。
let container = NSPersistentContainer(name: "DataModel")
container.loadPersistentStores { _, error in
if let error { fatalError("Core Data load failed: \(error)") }
}
let context = container.viewContext
viewContextはメインスレッドに結びついたメインコンテキストです。すべての読み取りとUI更新はこれを介して行われます。パフォーマンスのために、データ書き込みはバックグラウンドの子コンテキストで実行し、後で同期することをお勧めします。
NSPersistentStoreCoordinatorコーディネーターはモデルをディスク上の物理ストレージに接続します。Core DataはSQLite(推奨)、Binary、In-Memoryの複数のストアタイプをサポートしています。SQLiteストアはマイグレーション、増分バックアップ、書き込み操作中のクラッシュ耐性をサポートしています。
NSFetchRequestはCore Dataストアへのクエリを記述するオブジェクトです。Entity名、フィルタ述語、ソート記述子、フェッチ設定が含まれます。クエリはcontext.fetch()を介して実行され、NSManagedObjectの配列を返します。
let request = NSFetchRequest<User>(entityName: "User")
request.predicate = NSPredicate(format: "age >= %d", 18)
request.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
request.fetchLimit = 50
let results = try context.fetch(request)
NSPredicateは複雑な条件(LIKE、IN、BETWEEN、CONTAINS[c](大文字小文字を区別しない)、関連Entityに対するネストされたクエリのためのSUBQUERY)をサポートしています。Core DataはNSFetchedResultsControllerもサポートしています。これはUITableViewでのリアクティブデータローディングのためのクラスで、変更を自動的に追跡し、アニメーション付きセクションでテーブルを更新します。
マルチスレッドアプリケーションでCore Dataを扱うには、厳格なルールの遵守が必要です。NSManagedObjectはスレッド間で直接渡せません。各スレッド(またはキュー)は独自のコンテキストを使用する必要があります。主なアプローチは、書き込み用のプライベートキュー(NSPrivateQueueConcurrencyType)を持つ子NSManagedObjectContextと、読み取り用のviewContextを作成することです。
子コンテキストは親に保存し、次に親がディスクストアに保存します。これにより、変更がメインスレッドをブロックせず、UIが常にmergeChangesまたは保存時の自動viewContext更新を通じて一貫した状態を表示することが保証されます。
Core Dataはfaultingを使用します。これは関連オブジェクトの遅延ロードメカニズムです。アドレスを要求せずにUserをフェッチする場合、ドット記法でアクセスされるまで関連するAddressオブジェクトはロードされません。Faultingはメモリを節約しロードを高速化しますが、バックグラウンドコンテキストでのアクセスを制御しない場合、メインスレッドでの予期しないディスクアクセスを引き起こす可能性があります。
効率的なマルチスレッドのために、オブジェクトをメモリにロードせずに一括挿入・削除を行うNSBatchInsertRequestとNSBatchDeleteRequestを使用してください。これはサーバーとのデータ同期にとって重要です。
バッチ操作はコンテキストとオブジェクトグラフをバイパスして、NSPersistentStoreCoordinatorレベルで直接実行されます。これにより、メモリ内に10,000のNSManagedObjectインスタンスを作成せずに、ミリ秒単位で10,000レコードを挿入できます。バッチリクエストの実行後、mergeChangesFromContextDidSaveNotificationを介してコンテキストを更新し、UIに新しいデータを反映させる必要があります。Appleは、初期データロードとサーバーとの夜間同期にバッチ操作を推奨しています。
Core Dataでの変更追跡にはNSPersistentHistoryTrackingが使用されます。これは各トランザクション(挿入、更新、削除)を個別の履歴に記録するメカニズムです。履歴追跡を有効にすると、同じSQLiteファイルを操作する異なるプロセスやアプリケーション(メインアプリケーションとNotification Service Extensionなど)間でのデータ同期が可能になります。アクティベーションはpersistentHistoryTrackingKeyフラグを使用したNSPersistentStoreDescriptionを介して行われ、読み取りは日付とトランザクションタイプでフィルタリングするNSPersistentHistoryChangeRequestを介して行われます。
Core Dataのデバッグとパフォーマンスプロファイリングには、macOSのXcodeにあるInstrumentsスイートのCore Data Profilerツールを使用します。各操作の所要時間と、テーブルおよびタイムライングラフにロードされたオブジェクト数とともに、すべてのフェッチ、挿入、削除、保存操作が表示されます。開発者は問題領域を特定できます:同一クエリの複数フェッチ(キャッシュ不足)、テーブルスクロール時のfaultオブジェクトリーク、関連エンティティの同期的ロードによるメインスレッドのブロッキングなど。シミュレータのパフォーマンスはiPhoneやiPadでのアプリケーションの実際の動作を反映しないため、シミュレータではなく実機でプロファイリングを実行することをお勧めします。
よくある質問
Core Dataはデータベースではなく、SQLiteをストアとして使用できるオブジェクト管理層です。生のSQLiteとは異なり、Core Dataはオブジェクトの変更を追跡し、ロールバックを管理し、faultingとキャッシングを備えたオブジェクトグラフを提供します。SQLiteはクエリに対するより多くの制御を提供しますが、SQLを記述し、手動でトランザクションを管理する必要があります。
Core Dataは、非破壊的な変更(属性の追加、名前変更、デフォルト値の設定)に対してLightweight Migrationをサポートしています。複雑な変更にはMapping Modelを作成します。LightweightマイグレーションはNSPersistentStoreDescriptionのshouldMigrateAutomaticallyフラグで有効になります。
はい。Core DataはSwiftUIと統合され、クエリ用の@FetchRequestラッパーと変更サブスクリプション用の@ObservedObjectを提供します。ManagedObjectが変更されるとSwiftUIは自動的にViewを更新し、Core DataとSwiftUIは状態管理のための互換性のあるスタックになります。
Faultは関連オブジェクトのデータを含まないCore Dataグラフ内の軽量プレースホルダーです。faultが設定されると(refreshObject:を介して)、データはメモリからアンロードされます。プロパティにアクセスすると、faultは自動的にストアからのデータで満たされます。これはメモリ使用量を最適化する遅延ロードメカニズムです。
テストには、In-Memoryストアタイプ(NSInMemoryStoreTypeを持つNSPersistentStoreDescription)を使用します。コンテナはテストバンドルからモデルを使用して作成されます。各テスト後、すべてのオブジェクトを削除するかコンテナを再作成します。これにより、テストケースが互いに分離されます。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。