Core Data — その概要、データモデル、動作の仕組み

著者: IT Sectr 公開日: 2026-05-04 読了時間: 8 分

Core DataはAppleのデータ管理フレームワークで、iOS、macOS、tvOS、watchOS向けのオブジェクトリレーショナルマッピングを提供します。SQLite、XML、またはバイナリストレージ上で動作し、アプリケーション内のオブジェクトの保存、取得、フィルタリングを自動化します。Apple Core Data Documentationによると、このフレームワークはManaged Object ContextとNSPersistentContainerの概念を使用して永続化スタックを管理します。

重要なポイント

  • Core Data — アプリケーションでのオブジェクトリレーショナルデータ管理のためのAppleフレームワーク。
  • NSManagedObjectModel — データスキーマの記述:Entity、Attributes、Relationships。
  • NSManagedObject — Core Dataストア内の1つのレコードに対応するオブジェクト。
  • NSManagedObjectContext — オブジェクトを作成、読み取り、保存するためのワークスペース。
  • NSPersistentContainer — モデル、コンテキスト、ストアコーディネーターを統合する単一スタック。

Core Dataとは何か、iOSでの役割

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()を呼び出すと、コンテキストはすべての変更を単一のトランザクションで永続ストアにコミットし、データの原子性と一貫性を保証します。

データモデル:Entity、Attributes、Relationships

Core Dataのデータモデルは.xcdatamodeldファイルで定義されます。これはXcodeのビジュアルエディタで、すべてのEntity、その属性、リレーションシップが記述されます。コンパイル時にモデルは.momdにシリアライズされ、NSManagedObjectModelを介してロードされます。

EntityとAttributes

Entityはデータ型の記述であり、SQLのテーブルに似ています。各EntityにはAttributesのセット(String、Integer、Date、Boolean、Data型の名前付きフィールド)が含まれます。Roomとは異なり、Core Dataではモデルエディタを介して各属性に明示的な型選択が必要です。

Relationships

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)により、複数のスキーマバージョンを維持し、それらの間でマイグレーションを実行できます。

Core Dataスタック:PersistentContainerとContext

NSPersistentContainerはiOS 10およびmacOS 10.12以降、Core Dataスタックを管理する単一のオブジェクトです。NSManagedObjectModel、NSPersistentStoreCoordinator、NSManagedObjectContextをカプセル化し、モデルのロードとストア設定を自動化します。古いバージョンではスタックは手動で構築されていましたが、現在は推奨されていません。

swift
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

NSPersistentStoreCoordinatorコーディネーターはモデルをディスク上の物理ストレージに接続します。Core DataはSQLite(推奨)、Binary、In-Memoryの複数のストアタイプをサポートしています。SQLiteストアはマイグレーション、増分バックアップ、書き込み操作中のクラッシュ耐性をサポートしています。

NSFetchRequestとデータ操作

NSFetchRequestはCore Dataストアへのクエリを記述するオブジェクトです。Entity名、フィルタ述語、ソート記述子、フェッチ設定が含まれます。クエリはcontext.fetch()を介して実行され、NSManagedObjectの配列を返します。

swift
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

マルチスレッドアプリケーションで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の違いは何ですか?

Core Dataはデータベースではなく、SQLiteをストアとして使用できるオブジェクト管理層です。生のSQLiteとは異なり、Core Dataはオブジェクトの変更を追跡し、ロールバックを管理し、faultingとキャッシングを備えたオブジェクトグラフを提供します。SQLiteはクエリに対するより多くの制御を提供しますが、SQLを記述し、手動でトランザクションを管理する必要があります。

Core Dataのスキーママイグレーションを実行するには?

Core Dataは、非破壊的な変更(属性の追加、名前変更、デフォルト値の設定)に対してLightweight Migrationをサポートしています。複雑な変更にはMapping Modelを作成します。LightweightマイグレーションはNSPersistentStoreDescriptionのshouldMigrateAutomaticallyフラグで有効になります。

Core DataをSwiftUIで使用できますか?

はい。Core DataはSwiftUIと統合され、クエリ用の@FetchRequestラッパーと変更サブスクリプション用の@ObservedObjectを提供します。ManagedObjectが変更されるとSwiftUIは自動的にViewを更新し、Core DataとSwiftUIは状態管理のための互換性のあるスタックになります。

Core Dataのfaultとは何ですか?

Faultは関連オブジェクトのデータを含まないCore Dataグラフ内の軽量プレースホルダーです。faultが設定されると(refreshObject:を介して)、データはメモリからアンロードされます。プロパティにアクセスすると、faultは自動的にストアからのデータで満たされます。これはメモリ使用量を最適化する遅延ロードメカニズムです。

Core Dataコードをテストするには?

テストには、In-Memoryストアタイプ(NSInMemoryStoreTypeを持つNSPersistentStoreDescription)を使用します。コンテナはテストバンドルからモデルを使用して作成されます。各テスト後、すべてのオブジェクトを削除するかコンテナを再作成します。これにより、テストケースが互いに分離されます。

まとめ

  • Core DataはSQLiteをデフォルトストアとして使用するオブジェクトグラフ管理フレームワークです。
  • NSManagedObjectModelはスキーマ(Entity、Attributes、Relationships、Delete Rules)を記述します。
  • NSPersistentContainerはモデル、コーディネーター、viewContextを統合スタックに結合します。
  • NSFetchRequestはNSPredicateとNSSortDescriptorを使用してストアへの柔軟なクエリを形成します。
  • マルチスレッドには、書き込み用の子コンテキストと読み取り用のviewContextという別々のコンテキストが必要です。
  • Faultingは最初のアクセスまで関連オブジェクトのロードを遅延し、メモリを節約します。
  • Lightweight Migrationはデータ損失なしに非破壊的なスキーマ変更を自動的に処理します。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください