メメメモモ

プログラミング、筋トレ、ゲーム、etc

CoreDataをとりあえず使えるようにする手順

CoreDataややっこしいよ、後で理解するからとりあえず使ってみたい><
というときにとりあえず使えるようにする手順メモ。
プロジェクトを作成する際に「Use Core Data for storage」にチェックを入れれば、とりあえず使えるようになりますが、既存のプロジェクトに導入する際の手順にもなります。

プロジェクトの作成

プロジェクトは「Window-based-Application」を選択。
「Use Core Data for storage」にはチェックを入れません。

CoreData.frameworkの取り込みとxcdatamodelの作成

「CoreData.framework」を取り込みは、

  1. 「グループとファイル」の「Frameworks」で右クリック
  2. 「追加」-> 「既存のフレームワーク」を選択
  3. 「CoreData.framework」を選択して「追加」ボタンをクリック


「xcdatamodel」を作成は、

  1. 「Resources」で右クリック
  2. 「追加」 -> 「新規ファイル」を選択
  3. 「iOS」セクションの「Resource」を選択し、「Data Model」を選択して「次へ」ボタンをクリック
  4. ここの例では「CoreDataTest.xcdatamodel」というモデル名にして、「次へ」ボタンをクリック
  5. なんの操作もせずに「次へ」ボタンをクリック

エンティティを作成

作成した「CoreDataTest.xcdatamodel」をクリックすると編集画面が表示されます。
直感的に編集できるのではないかと思います。


「エンティティ」は、RDBでいう「テーブル」
「プロパティ」は、RDBでいう「カラム」
という風に思いこみます。


「Person」というエンティティを作成します。
プロパティは、下記のように設定しました。timeStampは必須にしています。

プロパティ 種類 タイプ
age 属性 Int16
firstName 属性 String
lastName 属性 String
timeStamp 属性 Date

プログラムの記述

データの追加・更新・削除・参照を簡単にやれるようなクラスを書いてみました。
SimpleCoreData
https://gist.github.com/744670

インスタンスの生成と設定
#import "SimpleCoreData.h"

/* オブジェクト生成 */
SimpleCoreData *simpleCoreData = [[[SimpleCoreData alloc] init] autorelease];
simpleCoreData.xcdatamodelName = @"CoreDataTest";
simpleCoreData.sqliteName = @"CoreDataTest";

インスタンスを作成した際に、xcdatamodelの名前を指定しています。
先程に「CoreDataTest.xcdatamodel」という名前で作成したので、@"CoreDataTest"と指定してます。

データ取得
/* データを取得する (fetchObject:) */
NSManagedObject *managedObject = [simpleCoreData fetchObject:@"Person" WithRow:i AndSection:0];

NSLog(@"%@", [managedObject valueForKey:@"firstName"]);
NSLog(@"%@", [managedObject valueForKey:@"lastName"]);
NSLog(@"%d", [[managedObject valueForKey:@"age"] intValue]);

エンティティ名と何番目のデータを取ってくるのかを指定して、ManagedObjectを得ます。
このインスタンスにデータが入っているので、NSDictionaryと同じ感じで参照します。

データの追加
/* 新しいデータを作成する (newManagedObject:) */
NSManagedObject *newManagedObject = [simpleCoreData newManagedObject:@"Person"];
[newManagedObject setValue:[NSDate date] forKey:@"timeStamp"];
[newManagedObject setValue:[NSNumber numberWithInt:10] forKey:@"age"];
[newManagedObject setValue:@"mememe" forKey:@"firstName"];
[newManagedObject setValue:@"momo" forKey:@"lastName"];
[simpleCoreData saveContext];

新しいnewManagedObjectを作成して、そこにデータを格納します。
その後に「saveContext」メソッドを呼び出して、データベースの更新を行ないます。

データの削除
/* データを削除する (deleteObject:) */

// rowとsectionを指定して削除する
[simpleCoreData deleteObject:@"Person" WithRow:0 AndSection:0];

// オブジェクトを渡して削除する
[simpleCoreData deleteObjectWithObject:managedObject];

削除のするデータの指定方法は二種類あります。

データの更新
/* データを更新する */
NSManagedObject *managedObject = [simpleCoreData fetchObject:@"Person" WithRow:i AndSection:0];
[managedObject setValue:@"testteste" forKey:@"firstName"];
[simpleCoreData saveContext];

既存のManagedObjectを取り出してきて、データを上書きします。
そして最後に「saveContext」メソッドを呼び出して、データベースを更新します。

サンプルコード

SimpleCoreDataクラスを使用したサンプルコードを作成しました。
UITableViewControllerとCoreDataを扱ったものになります。
https://github.com/memememomo/iphone-sample/tree/master/TableSimpleCoreData

参考リンク

まだまだCore Dataについては曖昧な理解なので、これから参照しようとしているリンク集です。