Core Dataは、iOSアプリケーションで永続したオブジェクトグラフを管理するためのAppleの第一次フレームワークです。開発者がSQLを作成したり、ファイルシリアライズを管理したりするよりもむしろ、Core Dataは、ストレージの複雑さ、トラッキングの変更、データモデリングを処理する高レベルのオブジェクト指向インターフェイスを提供します。ローカルデータを扱うすべてのiOS開発者は、パフォーマンスを犠牲にすることなく、コアデータの能力とベストプラクティスを理解しているはずです。

コアデータアーキテクチャの理解

Core Dataは単なるデータベースではありません。データをディスクに永続させることができるオブジェクトグラフ管理フレームワークですが、メモリ内オブジェクトの関連性、管理、検証も管理しています。このアーキテクチャは、一般的に「コアデータスタック」と呼ばれるものを形成するために一緒に動作する4つの主要コンポーネントを中心に展開しています。

コアデータスタック

コアデータ実装には、定義された順番でリンクされているオブジェクトの特定のセットが必要です。 スタックは、以下で構成されています。

  • [] 管理対象オブジェクトコンテキスト(NSManagedObjectContext):[] 管理対象オブジェクトを扱うスクラッチパッド。 パーシステントストアに保存される前に、すべての変更がコンテキスト内で行われます。
  • [ 永続店コーディネーター(NSPersistentstoreCoordinator):[] コンテキストと実際の永続店の間の橋として機能します。 それはアクセスを仲介し、データの完全性を保証します。
  • [] Object Model (NSManagedObjectModel):[ は、データスキーマ内のエンティティティ、属性、関係を記述します。通常、.xcdatamodeld ファイルに視覚的に定義されます。
  • [ 永続店:[]]]] 実際のストレージメカニズムは、SQLite、バイナリ、またはメモリ内であることができます。 SQLiteは、生産アプリのデフォルトです。

現代のiOS開発は、自動的に作成し、スタック全体を構成する [クラスを使用します。 これは、ボイラーの不規則化を取り除き、設定のチャンスを減らす。

プロジェクトでコアデータをセットアップする

Core DataをiOSプロジェクトに追加するには、データ管理の基礎をビルドする複数の非審美的な手順が必要です。このプロセスは、データモデルファイルの作成から、エンティティティティを定義し、最終的にアプリのライフサイクルでスタックを統合します。

データモデルの作成

[]]Data Modelテンプレートを使用してXcodeプロジェクトに新しいファイルを追加して起動します。 このビジュアルエディタでは、エンティティ(テーブルに相当する)、その属性(列)、その他のエンティティティティティティティとの関係を定義します。 また、データの種類、デフォルト値、バリデーションルール、およびクエリパフォーマンスを最適化するためのオプションを指定することもできます。

コミュニティと関係の定義

各エンティティティティティティティティは、ユーザー、タスク、または製品などの、アプリが管理するオブジェクトの一種を表します。属性は、そのエンティティティ(名前、価格、日付など)の特徴を定義します。関係は、エンティティティティティティティティティを結びつけ、コアデータがオブジェクトのグラフを追跡し、削除や更新を自動的に割り当てることを可能にします。例えば、「パーソン」エンティティティティティティは、「電話番号」のエンティティティティティティティティに1対1の関連があり、コアデータはどちらの方向で取得できます。

関係を設計するときは、[]の削除規則に注意を払ってください。オプションには、Nullify、Cascade、およびDenyが含まれます。間違ったルールを選択すると、予期しないデータ損失や孤立したレコードにつながることができます。Cascadeは、多くの場合、親子関係に適したが、Nullifyはオプションの関連付けのためにうまく機能します。

NSManagedObject のサブクラスを生成

実体モデルが完成したら、Xcode は各エンティティティティティティティティティティティティクトに対して Swift クラスを自動的に生成できます。これらのサブクラスは [ から継承され、定義されたプロパティと関係が含まれます。Xcode 8 から始まると、推奨されるアプローチは クラス定義 (デフォルト) として「Codegen」を選択し、生成されたファイルを生成されたデータフォルダーに保存します。また、必要に応じて、独自のサブクラスを作成したり、特定のプロパティを追加したり、または、特定のプロパティを補完したりすることができます。

クラウド運用の実行

スタックを所定の位置に置くと、[]]を使用して管理されたオブジェクトをインサート、フェッチ、更新、および削除できます。すべての操作はコンテキスト内で実行され、変更は成功した[[]呼び出し後にのみ持続されます。

オブジェクトの作成と保存

新規オブジェクトをインサートするには、[] を使用し、そのプロパティを設定します。すべての変更が終わったら、 を呼び出します。 ブロックで保存呼び出しを常にラップして、特にユーザが初期化したアクション中に、エラーを優雅に処理します。

述語とソート記述子でデータを取得する

[は、クエリオブジェクトの主メカニズムです。 ()を使用して結果が制約できます。 ]で結果が注文できます。 コアデータはまた、化合物の述語、サブクエリ、および関連を熱心に取得することができます。 大規模なデータセットの場合、常にでフェッチサイズを制限し、 [を使用してメモリの使用量を減らすために検討します]。

更新と削除

オブジェクトの更新は、コンテキスト内のプロパティを変更するのと同じくらい簡単です。コアデータが自動的に変更を追跡します。削除するには、[]を呼び出します。コンテキストを後で保存することを忘れないでください。バッチ削除のために、オブジェクトをメモリにロードすることなく永続的なストアで直接動作するを使用します。劇的にパフォーマンスを改善します。

生産準備のコアデータのためのベストプラクティス

適切に構成されたコアデータスタックであっても、慎重に処理されていない場合は、バグのボトルネックやソースになることができます。 確立されたパターンの後、アプリは、応答性、安定した、スケーラブルを維持します。

スレッドの安全と適合性

コアデータコンテキストはデフォルトではスレッドセーフではありません。スレッド間のコンテキストを共有しないでください。代わりに、[メソッドを使用して、バックグラウンド操作用のプライベートキューコンテキストを作成します。メインスレッドのオブジェクトにアクセスするとき、または[を使用して、スレッドの円滑化を確実にします。SwiftUIの場合、[プロパティラッパーは、メインコンテキストの変更を自動的に観察しますが、ヘビーなコンテキストはバックグラウンドを解除する必要があります。

検証と移行

アプリケーションが進化するにつれて、データモデルが変更されます。属性、名前変更、または関係の変更。コアデータは、2つのタイプのマイグレーションをサポートしています。[]軽量マイグレーションと[]]])。カスタムマイグレーション[[]]。 軽量マイグレーションは、単純な変更(属性の追加、オプションの変更、識別子付きのプロパティの変更)を、オプションを追加したときに、自動的にサブクラスをパスするオプションを実装することができます。 [FLT:] 複雑なモデルを追加するときに、オブジェクトを実装することができます。

パフォーマンスの最適化

効率的なコアデータ性能は、データモデルの設計から始まります。 ] インデックス を、多くの場合、述語で表示する属性で使用します。 サブセットのみが必要になったときに、オブジェクトのグラフ全体を取得することを避けてください。 代わりに、 と [] を使用します。 コアデータサポート ] の検索は、オブジェクトのプロパティがアクセスされるまでは、 [FLT:] を変換するのではなく、 [FLT:] をコピーして、 [FLT] オブジェクトの検索結果が読み込まれるときにのみ表示されます。 [FLT: [FLT: [F] は、オブジェクトの対象オブジェクトの対象オブジェクトの対象オブジェクトのオブジェクトのオブジェクトが、オブジェクトの検索時に、オブジェクトが、オブジェクトが [FLT: [FLT: [FLTFLT: [FLT:] を[F] を[F] オブジェクトのオブジェクトの対象オブジェクトの対象オブジェクトが [FLTF] を[FLTF] を[F] を[FLTF] を

エラー処理

それぞれのフェッチ、保存、削除操作は、潜在的に失敗する可能性があります。常に[ブロックにこれらの呼び出しを閉じ、ユーザーに意味のあるエラーメッセージが表示されます。 検証エラーや制約違反により、障害を頻繁に保存し、エラーを慎重に検査します。 コアデータのエラーオブジェクトには、特定のフィードバックを提供するために、複数の従順なエラーが含まれている。 バッチ操作のために、適切な方法でを処理します。 バッチ削除が自動的に削除されないことに注意してください。 したがって、オブジェクトは、手動で関連したオブジェクトを処理する必要がある場合があります。

SwiftUI でコアデータを統合

SwiftUIは、プロパティのラッパーと環境値を介してコアデータに対する一流のサポートを提供します。 [[]ラッパーは、データが変更されたときに、メインのコンテキストを自動的に観察し、ビューをリフレッシュします。 ソート記述子を設定し、プロパティ宣言で直接述語ることができます。 より詳細な制御のために、管理されたオブジェクトのコンテキストをを使用して環境に注入します。 と動作する場合には、`@ObservedObject`または`@StateObject` をビューモデルに動作させると、参照を重度の動作確認するために、モデルが保持されていることを確認してください。

SwiftUIは、管理を簡素化します。コンテキストでを設定し、SwiftUIはシステムのundo/redoジェスチャーと自動的に統合します。

コアデータ対その他の持続オプション

Core DataはiOSのローカルストレージの最も成熟した統合ソリューションですが、常に最良の選択ではありません。代替手段と比較してください。

  • []UserDefaults:]]] ユーザの好みの少量に適していますが、複雑なデータや大きなデータでは使用できません。
  • []Realm:]]は、よりシンプルなAPIと自動反応更新を提供し、依存性を追加し、SwiftUIと深く統合しません。
  • [] ラウ SQLite:[] は非常に大きなデータセットや複雑なクエリに対して、最大限の制御とパフォーマンスを発揮しますが、接続の管理、移行、手動でスレッド化する必要があります。
  • []クラウドキット+コアデータ:[]]:iCloud同期を必要とするアプリの場合、Appleのは、コアデータとCloudKitをブリッジし、自動的にクラウドへのローカル変更を同期させます。

構造化されたデータ、関係、オフライン機能を必要とするほとんどのiOSアプリでは、コアデータがプラットフォームと継続的なAppleサポートとのシームレスな統合により、推奨される選択肢を維持します。

コンテンツ

Core Dataは、持続的なストレージの複雑さを抽象化し、トラッキングを変更し、関係管理を変革するオブジェクトのグラフ管理システムを提供します。管理されたオブジェクトのコンテキストから永続的なコンテナまで、そのアーキテクチャを理解し、一貫性、パフォーマンス、エラー処理の実証済みの実践に従い、開発者は、堅牢で応答性の高いアプリを構築することができます。 簡単なTodoリストやデータインテンシブなエンタープライズアプリケーションを構築するかどうか、Core Dataは、iOSの管理に関する効率的なローカルデータをロックする貴重なスキルです。

さらなる研究のために、 []Apple Core Data documentation[], []]]コアデータプログラミングガイド, コミュニティリソース(]), レイ・ウィンダーリックのCore Data by Tutorials[]), 移動やコン通貨などの高度なトピックに対する深い洞察力.