CoreDataややっこしいよ、後で理解するからとりあえず使ってみたい><
というときにとりあえず使えるようにする手順メモ。
プロジェクトを作成する際に「Use Core Data for storage」にチェックを入れれば、とりあえず使えるようになりますが、既存のプロジェクトに導入する際の手順にもなります。
プロジェクトの作成
プロジェクトは「Window-based-Application」を選択。
「Use Core Data for storage」にはチェックを入れません。
CoreData.frameworkの取り込みとxcdatamodelの作成
「CoreData.framework」を取り込みは、
- 「グループとファイル」の「Frameworks」で右クリック
- 「追加」-> 「既存のフレームワーク」を選択
- 「CoreData.framework」を選択して「追加」ボタンをクリック
「xcdatamodel」を作成は、
- 「Resources」で右クリック
- 「追加」 -> 「新規ファイル」を選択
- 「iOS」セクションの「Resource」を選択し、「Data Model」を選択して「次へ」ボタンをクリック
- ここの例では「CoreDataTest.xcdatamodel」というモデル名にして、「次へ」ボタンをクリック
- なんの操作もせずに「次へ」ボタンをクリック
エンティティを作成
作成した「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については曖昧な理解なので、これから参照しようとしているリンク集です。