アプリ開発も6割型は進み、いよいよデータベースの出番がやってきました。
当初はrealmでいこうと考えましたが、導入書読んで撃沈。難しすぎる・・・
そこでひとまずCoreDataを使うことに決め、いざ構築開始。
指示書通りになんとか出来たかなと思ったのも束の間、最終的に確認するとデータの永続化が出来ない!
どんなに調べても、書き直しても、何しても、何しても、ビルドするとデータが消えてしまうのです😭
いっそのこと、データの永続化が出来ないまま仕上にしたくなる衝動に駆られるるまま、Xcodeの画面に向かうこと1週間、いやもっと長期間だったのかも。
ある時(夜の11時過ぎ)に突然データの永続化ができるようになりました。
一人狂喜乱舞!寝ていた犬も訳が分からず大興奮😆
そんなこんなで、備忘録としてCoreDataの情報をまとめておくことにしました。
Core Dataの概要
Core Dataは、オブジェクトグラフ管理とデータの永続化を扱うフレームワークとなります。
主な機能は以下となります。
- データモデルの定義: データモデルエディタを使用して、エンティティ、属性、リレーションシップをグラフィカルに定義します。
- データの永続化: ユーザーのデータをディスクに保存し、必要に応じて再度読み込みます。
- オブジェクトのライフサイクル管理: インスタンスの作成、更新、削除を管理します。
- クエリ機能: データを検索・取得するための強力なクエリ機能を提供します。
主要コンポーネント
- Managed Object Model (モデル): データの構造を定義するスキーマ。エンティティ(データの種類)、属性(プロパティ)、リレーションシップ(エンティティ間の関係)を含みます。
- Managed Object Context (コンテキスト): 実行中のオブジェクトの状態を管理するための環境。変更を管理し、保存または取り消しができます。
- Persistent Store Coordinator (ストアコーディネータ): 物理的なデータストア(通常はSQLiteデータベース)とアプリケーション間のインターフェース役を果たします。
組み込みプロセス
- データモデルの作成: Xcode内で
.xcdatamodeld
ファイルを作成し、エンティティや属性を定義します。 - NSPersistentContainerの設定:
NSPersistentContainer
を利用してデータモデルに基づいてデータベースを初期化します。- このコンテナはコーディネータ、マネージドオブジェクトモデル、マネージドオブジェクトコンテキストを自動的にセットアップします。
swiftCopy codelet container = NSPersistentContainer(name: "ModelName") container.loadPersistentStores { (storeDescription, error) in if let error = error as NSError? {fatalError("Unresolved error \(error), \(error.userInfo)") } }
- データ操作:
- データの作成、読み込み、更新、削除を行います。
- コンテキストを通じてこれらの操作を行い、必要に応じてコンテキストを保存。
swiftCopy codelet newEntity = EntityName(context: context) newEntity.property = value do { trycontext.save() } catch { let nsError = error as NSError fatalError("Error: \(nsError), \(nsError.userInfo)") }
- データの取得:
NSFetchRequest
を用いてデータをクエリします。
swiftCopy codelet fetchRequest = NSFetchRequest<EntityName>(entityName: "EntityName") do { letresults = try context.fetch(fetchRequest) // データを操作 } catch { print("Fetch failed") }
注意点
- スレッド安全:
NSManagedObjectContext
はスレッドセーフではないため、使用するスレッドに注意が必要。 - データモデルのバージョニングとマイグレーション: データモデルが変更された場合、適切なマイグレーション戦略が必要。