Core Dataの基本

シェアする

Header
iOSの標準のデータベースフレームワーク「Core Data」。

バックエンドデータベースのSQLite3の詳細を隠し、使いやすくしてくれるものですが、関連するクラスやファイルが多く、学習コストが高いフレームワークとして知られています。

ここではCore Dataの最も簡単な使用法をサンプルプログラムを作成しながら説明します。

サンプルプログラムの作成

Xcodeを立ち上げ新規プロジェクトで「Single View Application」を選択します。プロジェクトの設定で「Use Core Data」のチェックを入れるとCore Dataが最初から使用できるプロジェクトが作成されるのですが、ここではあえてチェックを入れずに作成してください。

自力でCore Dataサポートを追加する場合以下の前準備が必要となります。

  • .xcdatamodeldの作成(テーブル定義に相当)
  • NSManagedObjectのサブクラスの作成(テーブルデータレコードを格納するクラス)

実際に処理を行う場合は次の順序で処理を行います。

  • Core Dataスタックの初期化(NSManagedObjectContextの生成)
  • NSManagedObjectContextとNSManagedObjectのサブクラスを利用して、データの取得、追加、削除、更新処理を実行

.xcdatamodeldの作成

まずはじめにデータベースのテーブル構造を定義する.xcdatamodeldを作成します。

「File > New > File」を選択し「Core Data」から「Data Model」を選択し、例えば「DemoModel.xcdatamodeld」を作成します。名前は適当でかまいません。

Add entity

「Add Entity」アイコンをクリックしエンティティ(テーブル)を追加します。

Entityの名前を好きに変更し「Add Attributes」で属性(カラム)を追加していきます。

Attributes

属性の名前や型などの情報はAttributeパネルで設定します。名前と型が重要なのはもちろんですが、Optionalのチェックにも注意が必要です。非Optional(Not Null)の属性を使用する場合チェックを外しておきましょう。

NSManagedObjectのサブクラスの作成

次に作成したエンティティに対応したクラスを作成しましす。

「File > New > File」を選択し「Core Data」から「NSManagedObject subclass」を選択します。先ほど作成した「Book」エンティティを選択すると以下の2つのファイルが作成されます。

Book.swift: 独自処理を追加する

Book+CoreDataProperties.swift: 属性定義が行われている

なおCore DataのOptionalのチェックを外していても、生成されるSwiftのソースコードではOptional型の属性が定義されるようです。

Swift側でも非Optionalとして扱いたい場合「String?」から「String」のように最後の「?」を手動で削除しておきましょう。

自動的に反映されない理由としてCore DataとSwiftのOptionalの意味が違うことが上げられています。詳細が気になる方は以下のリンクを参照してください。

参考: Why Xcode generated NSManagedObject Subclass contains always optional properties even if they are marked as non-optional?

一応これで前準備は完成です。

Core Dataスタックの初期化

次にCore Dataを使用する前に必要な処理を作成します。

ここではCore Data関連の処理を初期化するためのクラスとしてDataControllerを作成します。「Use Core Data」にチェックを入れていた場合AppDelegateに自動的に書き込まれる処理とほぼ同様の処理となっています。

クラスが多数登場しかなり複雑な処理に見えますが、基本はNSManagedObjectContextを初期化して返しているだけのクラスです。以下の公式ドキュメントを参照にしました。

参考: Initializing the Core Data Stack

DataController.swift

NSManagedObjectContextは通常アプリケーションごとに一つのインスタンスを作成すれば十分であるため、ここではAppDelegateから取得できるようにします。

AppDelegate.swift

Core Data保存・読み込み処理の実装

いよいよCore Dataのデータを操作する処理を作成します。

ここではViewControllerに4つのボタンを設置しボタンを押した際にCore Dataの「保存」「読み込み」「削除」「バッチ削除」を実行する処理を作成します。

本来は取得したデータはテーブルビューなどのコントロールに表示するのですが、ここでは説明のためコンソール上にデバッグ出力するだけにとどめます。

最初に全体のソースコードを掲載します。

ViewController.swift

データを読み込む場合NSFetchRequestでエンティティ名を指定して、NSPredicateによる条件を指定してexecuteFetchRequestを実行します。エンティティ全体を取得する場合はNSPredicateの指定は不要です。

データを新規作成する場合、insertNewObjectForEntityForNameによってオブジェクトを生成し、オブジェクトに値を設定した後NSManagedObjectContextのsave()を呼び出します。

データの削除はNSManagedObjectのサブクラスをNSManagedObjectContextのdeleteObject()に渡します。削除対象のオブジェクトが存在しない場合はデータを取得した後、そのオブジェクトをdeleteObject()します。

iOS 9以降NSBatchDeleteRequestバッチ削除も実行できます。削除する件数が多い場合はこちらの方が有利です。

実行

Header

▲実行するとエミュレーターが起動します。

Result

▲ボタンを押すとログがコンソールに表示されます。

まとめ

Core Dataは複雑なように見えますが、基本は以下の3つの重要ポイントを押さえておけば使用することができます。

  • Core Dataテーブルの定義を行う.xcdatamodeld
  • モデルに該当するNSManagedObjectのサブクラス
  • 読み書きを行うNSManagedObjectContext

ただしUITableViewで効率良く使用するにはさらにNSFetchedResultsControllerと呼ばれる重要なクラスの使い方を覚える必要もあります。この部分は次回説明します。

スポンサーリンク
レクタングル(大)広告
レクタングル(大)広告

シェアする

フォローする