【Swift】Core Dataの設定。外部ファイルに保存されない一時的な属性を定義する。(Swift 2.1、XCode 7.2)

2020年6月16日

Attributeの設定

本記事ではCore Dataのエンティティに定義されているAttribute(以下、属性)の設定について説明する。

以降の検証を行う前のXcodeプロジェクトをGitHubに置いたので、試してみる人はご利用されたし。
⇒「テスト用プロジェクト

事前準備では、氏名と年齢を入力して登録ボタンを押すとCore Dataを使って外部ファイルにデータが保存されるものを実装しておいた。

 

属性の設定画面を開くには、下図赤枠の「プロジェクト名.xcdatamodeld」を選択、黄緑枠のエンティティを選択、黄枠の属性を選択、紫枠のデータモデルインスペクタボタンを押す。

Attributeの設定画面を開く

 

Name

属性の名前。

 

Transient

チェックを入れると、外部ファイルに保存されない一時的な属性になる。

試してみよう。下図赤枠の「+」ボタンを押して属性を追加する。黄緑枠のデータモデルインスペクタボタンを押して設定画面を表示し、Nameに「Test」を入力、Transientにチェックを入れる。

Transientの属性を追加する

 

下図赤枠の「プロジェクト名.xcdatamodeld」を選択したあと、メニュー⇒「Editor」⇒「Create NSManagedObject Subclass」とたどる。

エンティティのサブクラスを作成する

 

データモデルの一覧が表示されるので、「プロジェクト名」にチェックが入っていることを確認して「Next」ボタンを押す。

カスタムクラスを作るデータモデルを選択する

 

データモデルに定義されているEntityの一覧が表示されるので、Playerにチェックを入れて「Next」ボタンを押す。

カスタムクラスを作るエンティティを選択する

 

保存先を指定する画面が表示されるので、プロジェクトのフォルダが指定されていることを確認して「Create」ボタンを押す。

保存先を指定する

 

すると、Player+CoreDataProperties.swiftのPlayerクラスにtestプロパティが追加される。通常の属性と一時的な属性の宣言は同じである。

 

ViewController.swiftを以下のコードに変更する(青色網掛けが変更箇所)。

管理オブジェクトコンテキストに新しいオブジェクトを追加するときにtestプロパティに777を設定したのと、ラベルにtestプロパティの値も表示するようにした。

 

以下は実際のプレイ動画。777に設定したtestプロパティの値が保存されずに0になることが分かる。

testプロパティの値が消えるイメージを下図で説明する。

管理オブジェクトコンテキストに「name=太郎、age=20歳、test=777」のオブジェクトを追加する。この段階ではtestプロパティは777のままである。

管理オブジェクトコンテキストにオブジェクトを追加

 

次に、管理オブジェクトコンテキストのsaveメソッドを呼び出すと、オブジェクトが外部ファイルに保存されるが、testプロパティは一時的な属性のため値は保存されずにname、ageの値が保存される。保存したオブジェクトは管理オブジェクトコンテキストの管理対象から外れて消滅する。

そのため、同じオブジェクトを読み込むときは外部ファイルから読み込まれてtestプロパティは初期値になっている。

ただし、saveメソッドの処理が終わった直後にオブジェクトが消滅するのではなく、saveメソッドを含むプロセスが終了した段階に消滅するような検証結果になっている。プレイ動画でも最初は777が表示されたのもそのためと考えられる。これについては明確になり次第追記する。

データを保存する

 

では、saveメソッドを呼び出さなかったらtestプロパティの値はずっと777のままなのかを確認しておこう。

ViewController.swiftの以下のコードをコメントアウトしてシミュレーターを起動する。

 

以下は実際のプレイ動画。testプロパティの値はずっと777になった。

ただし、アプリを終了するときに自動でsaveメソッドが呼び出されるようになっているので、アプリを再起動するとtestプロパティが初期値0のデータが表示される(AppDelegate.swiftを参照)。