The Missing Manual
for Swift Development
The Guide I Wish I Had When I Started Out
Join 20,000+ Developers Learning About Swift Development
Download Your Free Copy
あなたがこれを読んでいるとしたら、あなたは Core Data に初めて触れた人でしょうか? Core Data について聞いたことがあり、それがあなたやあなたが取り組んでいるプロジェクトに適しているかどうかを調べたいと思っているかもしれません。 もし、この説明に当てはまるなら、どうぞお座りください。 この Core Data チュートリアルでは、Core Data が何であり、何でないかをよりよく理解するために知っておく必要があるすべてのことを教えます。 Core Data が何であるかを知らないと、その内部と外部を理解することが非常に困難になります。 数分かけて Core Data の本質を探り、さらに重要なこととして、Core Data が何であり、何でないかを明確にしたいと思います。 10 年以上前から存在し、2005 年に macOS Tiger がリリースされたときに、初めて macOS に登場しました。
Where Does It Fit In
Core Data は MVC の M、つまりアプリケーションのモデル レイヤーにあたります。 Core Data はデータをディスクに永続化できますが、データの永続化は実際にはフレームワークのオプション機能です。 コア データは、何よりもまず、オブジェクト グラフを管理するためのフレームワークです。
このコースを受講する前に、おそらくコア データについて聞いたり読んだりしたことがあると思います。 つまり、Core Data がデータベースではないこと、そして、アプリケーションのオブジェクトグラフを管理することをすでにご存知かもしれません。 どちらの記述も正しいです。
Managing an Object Graph
Core Dataは何よりもまず、オブジェクトグラフを管理します。 オブジェクト グラフとは、互いに接続されたオブジェクトのコレクションに他なりません。 Core Data フレームワークは、複雑なオブジェクト グラフの管理に優れています。
オブジェクト グラフ内のオブジェクトのライフサイクルを管理し、オプションでオブジェクト グラフをディスクに持続させることができます。 また、管理するオブジェクト グラフを検索するための強力なインターフェイスも提供します。
But Core Data はそれ以上のものです。 フレームワークは、入力検証、データモデルのバージョニング、および変更追跡など、他の多くの魅力的な機能を追加します。 軽量のモデル レイヤーを必要とするアプリケーションは、Core Data を使用するべきではありません。 この種の機能を提供する多くの軽量ライブラリがあります。
SQLite ラッパーを探している場合、Core Data は必要なものでもありません。 軽量でパフォーマンスの高い SQLite ラッパーとしては、Gus Mueller の FMDB を強くお勧めします。 この堅牢で成熟したライブラリは、SQLite と対話するためのオブジェクト指向インターフェイスを提供します。
Core Data は、アプリケーションのモデル層を管理するソリューションが必要な場合に最適な選択肢です。 SQLite と Core Data のどちらが必要かと考えているのであれば、それは間違った質問です。 Core Data はデータベースではないことを覚えておいてください。
SQLite
SQLite は非常にパフォーマンスの高い軽量なデータベースであり、したがって、モバイル アプリケーションによく合います。 SQLite はリレーショナル データベースとして宣伝されていますが、データベースに格納されたレコード間の関係を維持するのは、開発者であるあなた自身であることを認識することが重要です。 これは、オブジェクト指向の方法でモデル層と対話できるようにする抽象化を提供します。 あなたが相互作用するすべてのレコードはオブジェクトです。 コア・データはオブジェクト・グラフの整合性に責任を持ちます。 オブジェクト グラフが最新に保たれていることを保証します。
Core Data Limitations
Core Data は素晴らしいフレームワークですが、いくつかの欠点もあります。 これらの欠点は、フレームワークの性質とそれがどのように動作するかに直接関係します。
Core Data は、それが管理するオブジェクト グラフをメモリ内に保持するので、その魔法を使うことができるだけです。 これは、レコードがメモリ内にある場合にのみ、レコードを操作できることを意味します。 これは、データベース上でSQLクエリを実行するのとは全く異なります。 何千件ものレコードを削除する場合、Core Dataはまず各レコードをメモリにロードする必要がある。 1264>
Core Data のもう 1 つの重要な制限は、スレッド モデルです。 フレームワークは、単一のスレッドで実行されることを想定しています。 幸いにも、Core Data は長年にわたって劇的に進化しており、フレームワークは、マルチスレッド環境で Core Data をより安全かつ簡単に扱うためのさまざまなソリューションを導入しています。
Exploring the Core Data Stack
Core Data が何であり、何でないかがわかったので、次はフレームワークの構成ブロックにズームインしてみましょう。 フレームワークの主役は、
- 管理オブジェクト モデル
- 管理オブジェクト コンテキスト
- および永続ストア調整ツール
以下の図は、これらのクラスが互いにどう関係していることを示しています。 管理オブジェクト モデルから始めましょう。
Managed Object Model
Managed Object Model は NSManagedObjectModel
クラスのインスタンスです。 典型的な Core Data アプリケーションは NSManagedObjectModel
クラスのインスタンスを 1 つ持ちますが、複数持つことも可能です。 管理オブジェクト モデル インスタンスは、Core Data アプリケーションのデータ モデルを表します。
上の図は、管理オブジェクト モデルがデータ モデルに接続されていることを表しています。 データ モデルは、アプリケーションのデータ スキーマを含むアプリケーション バンドル内のファイルによって表されます。 データ スキーマはエンティティのコレクションにほかなりません。
エンティティは、アプリケーションのデータ モデルを構成する属性と関係を持つことができます。 インスタンスがNSManagedObjectModel
クラスの管理されたオブジェクトモデルであり、それがCore Dataアプリケーションのデータモデルを表すことを今のところ覚えておく。
Managed Object Context
A managed object context is represented by an instance of the NSManagedObjectContext
class. Core Data アプリケーションには 1 つ以上の管理されたオブジェクト コンテキストがあり、それぞれがモデル オブジェクトのコレクション、NSManagedObject
クラスのインスタンスを管理します。
前に調べた図では、管理されたオブジェクト コンテキストは永続ストア コーディネーターを介してモデル オブジェクトを受信することが示されています。
マネージド オブジェクト コンテキストは、ユーザーが最もよく使用するオブジェクトです。 モデル オブジェクトを作成、読み取り、更新、および削除します。 開発者の観点から、NSManagedObjectContext
クラスは Core Data フレームワークの主力です。
Persistent Store Coordinator
Persistent Store Coordinator は NSPersistentStoreCoordinator
クラスのインスタンスによって表され、すべての Core Data アプリケーションで重要な役割を担います。 複数の永続ストア・コーディネーターを持つことも可能ですが、ほとんどのアプリケーションでは1つしかありません。
Persistent Store Coordinator はマネージド オブジェクト モデルへの参照を保持し、すべての親マネージド オブジェクト コンテキストは persistent store coordinator への参照を保持します。 上の図は、永続ストア・コーディネーターが 1 つまたは複数の永続ストアに接続されていることを示しています。 これにより、永続ストアにたどり着きます。
Persistent Store
Core Dataはオブジェクトグラフを管理することを覚えておいてください。 このフレームワークは、永続ストア・コーディネーターが1つまたは複数の永続ストアに接続されている場合にのみ有効です。 1264>
- a SQLite データベース
- a バイナリストア
– インメモリストア
それぞれの永続ストアのタイプには長所と短所があります。 ほとんどのアプリケーションでは、永続ストアにSQLiteデータベースを使用しています。 先に述べたように、SQLite は軽量で非常に高速です。 1264>
コア データ スタックの仕組み
コア データ スタックがどのように構成されているかを理解したところで、アプリケーションでそれがどのように動作するかを調べてみましょう。 Core Data アプリケーションの中心は、永続ストア コーディネータです。 1264>
But to create the persistent store coordinator, we need a managed object model. それはなぜでしょうか。 1264>
Persistent Store Coordinator と managed object model をセットアップしたら、Core Data スタックの主力である managed object context が初期化されます。 管理オブジェクト コンテキストは、永続ストアのコーディネーターへの参照を保持することを覚えておいてください。
Core Data スタックをセットアップすると、アプリケーションの永続ストアと対話するために Core Data を使用する準備が整いました。 ほとんどの場合、アプリケーションはマネージド オブジェクト コンテキストを通じて永続ストア調整者と対話します。
永続ストア調整者またはマネージド オブジェクト モデルと直接対話することはほとんどありませんが、ある場合には、永続ストア調整者またはマネージド オブジェクト モデルと対話します。 先ほど述べたように、NSManagedObjectContext
クラスは最も頻繁にやり取りするクラスです。
管理オブジェクト コンテキストは、レコードを作成、読み取り、更新、および削除するために使用されます。 管理オブジェクト・コンテキストで行われた変更が保存されると、管理オブジェクト・コンテキストはそれを永続ストア・コーディネーターにプッシュし、コーディネーターはその変更を対応する永続ストアに送信します。
アプリケーションに複数の永続ストアがある場合、永続ストア コーディネータは、どの永続ストアが管理オブジェクト コンテキストの変更を保存する必要があるかを判断します。 ほとんどの開発者はこのステップをスキップするので、あなたはすでに先を行っています。 次に必要なのは、フレームワークを使い始めることです。 もし助けが必要なら、Mastering Core Data With Swift をチェックすることをお勧めします。
The Missing Manual
for Swift Development
The Guide I Wish I Had When I Started Out
Join 20,000+ Developers Learning About Swift Development
Download Your Free Copy