今回は、CoreDataについて紹介します。
CoreData は、メモリ上のオブジェクトをリレーショナルデータベースである SQLite のレコードに変換して保存、または、その逆にレコードをオブジェクトに変換してメモリ展開するフレームワークです。レコードとオブジェクトの変換を行うフレームワークのことをO/R マッピングフレームワークと呼びます。
では、実際にCoreDataを使用して、データベースにアクセスするiPhoneアプリを作成したいと思います。
今回の開発環境は以下の通りです。
・OS X v10.9
・Xcode v5.0.2
まず、Xcodeでプロジェクトを作成します。
Xcodeを起動します。

「Choose a template for your new project」画面で
「Empty Application」を選択します。
「Next」ボタンを押下します。

「Choose options for your new project」画面で
「Product Name」にプロジェクト名を入力します。
「Use Core Data」にチェックをいれます。
「Next」ボタンを押下します。

先ほどの「Use Core Data」を選択して、プロジェクトを作成すると、
「coreDataSample1.xcdatamodeld」が作成されています。
Xcodeのファイル一覧画面で「coreDataSample1.xcdatamodeld」を選択します。


「Add Entity」を選択すると、新しくEntityが追加されます。データベースのテーブルの部分になります。
ここでは、「SampleEntity」と入力します。
ENTITIESの「SampleEntity」を選択します。


「Add Attribute」を選択すると、新しくAttributeが追加されます。データベースのカラムの部分になります。
「Attribute」がカラム名、「Type」がカラムの型となります。
ここでは、「name」及び「age」を入力します。

プロジェクトで右クリックして、新しくファイルを作成します。
「CoreData」から「NSManagedObject」を選択します。
「Next」を押下します。

データモデルを選択します。
「Next」を押下します。

Entityを選択します。
「Next」を押下します。完了すると、自動的に「SampleEntity.h」「SampleEntity.m」ファイルが生成されます。
次に、DAOを作成します。
DAOとは、Data Access Objectの略です。
データベースを操作するインタフェースを提供するオブジェクトになります。
Xcodeのプロジェクトを右クリックして[New File...]を選択します。
Choose a template for your new file画面で[Cocoa Touch]->[Objective-C class]を選択します。
以下の値を入力して、DAOクラスを作成します。
・Class: SampleEntityDAO
・Subclass of: NSObject
- (void)setSampleEntityName:(NSString *)name age:(NSNumber *)age
{
AppDelegate *appDeletage = [[UIApplication sharedApplication]delegate];
NSManagedObjectContext *managedObjectContext = [appDeletage managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
NSEntityDescription *entityDes = [NSEntityDescription entityForName:@"SampleEntity" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entityDes];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@", name];
[fetchRequest setPredicate:predicate];
NSError *error = nil;
NSArray *result = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
if(nil != error){
NSLog(@"SampleEntityDAO#setSampleEntityList error %@, %@", error, [error userInfo]);
}
int resultCnt = [result count];
if(0 == resultCnt){
SampleEntity *item = [NSEntityDescription insertNewObjectForEntityForName:@"SampleEntity" inManagedObjectContext:managedObjectContext];
item.name = name;
item.age = age;
} else {
SampleEntity *item = [result objectAtIndex:0];
item.age = age;
}
BOOL ret = [managedObjectContext save:&error];
if(!ret){
NSLog(@"SampleEntityDAO#setSampleEntityList error %@, %@", error, [error userInfo]);
}
}
NSEntityDescriptionクラスで、SampleEntityのエンティティ情報を取得しています。NSPredicateクラスで、「name」のAttributeと一致しているレコードを検索しています。検索の結果、一致しなければ(0 == resultCnt)レコードをInsertしており、一致していれば「age」の値を更新しています。
- (NSArray *)getSampleEntityItemList
{
AppDelegate *appDeletage = [[UIApplication sharedApplication]delegate];
NSManagedObjectContext *managedObjectContext = [appDeletage managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
NSEntityDescription *entityDes;
entityDes = [NSEntityDescription entityForName:@"SampleEntity" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entityDes];
NSSortDescriptor *sortDes = [[NSSortDescriptor alloc]initWithKey:@"age" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc]initWithObjects:sortDes, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
NSError *error = nil;
NSArray *itemList = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
if(nil != error){
NSLog(@"SampleEntityDAO#getSampleEntityItemList error %@, %@", error, [error userInfo]);
}
return itemList;
}
NSSortDescriptorクラスで、「age」のAttributeで昇順にソートを行っています。
DAOの呼び出し部分を作成します。
DAOを使いたいクラスで記述してください。
SampleEntityDAO *dao = [[SampleEntityDAO alloc]init];
[dao setSampleEntityName:@"ゆんぼう" age:[NSNumber numberWithInt:17]];
[dao setSampleEntityName:@"たけぼう" age:[NSNumber numberWithInt:28]];
[dao setSampleEntityName:@"しおぼう" age:[NSNumber numberWithInt:40]];
[dao setSampleEntityName:@"あさぼう" age:[NSNumber numberWithInt:29]];
NSArray *itemList = [dao getSampleEntityItemList];
for(SampleEntity *item in itemList) {
NSLog(@"name:%@, age:%@",item.name, item.age);
}
setSampleEntityName でデータベースにデータを保存して、getSampleEntityItemList でデータベースからデータを読み出しています。
実行すると下記の内容になります。
出力結果
name:ゆんぼう, age:17
name:たけぼう, age:28
name:あさぼう, age:29
name:しおぼう, age:40
以上です。