[iOS] iPhoneアプリで データベース(CoreData)を作成する | パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください

パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください

開発の解決方法や新しい手法の情報を、パークのエンジニアが提供します。パークのエンジニアが必要な場合は、ぜひお気軽にお問い合わせ下さい。 株式会社パーク:http://www.pa-rk.co.jp/

こんにちは。ゆんぼう です。
今回は、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

以上です。