CoreData入門 | TokoTokoSoftware

TokoTokoSoftware

iPhone / iPadアプリを作っている団体「トコトコ」です
大学生二人でMacBookつかって頑張ってます!!

こんにちは~

さてさて!今回は「CoreData入門」ってことで 難しいこと抜きで
CoreDataは構造を考えるとめんどいのでまずその使い方から。


[CoreDataからデータを読み出す]

いきなりCoreDataからデータを取り出してみましょう。(いれてもないのに出せるか!というツッコミは抜きで)
データモデルのやり方については端折ります。ググッてください。
モデルとしては下の写真にあるように エンティティ「user」に属性
name (nsstring)
telnumber (nsnumber)
があるとしましょう
TokoTokoSoftware
さて、こんなデータからデータを読み出すわけですが、登場人物が3人居ます。

NSManagedObjectContext     ・・・これがデータ全体。ここへリクエストを送るとアレイが返ってくる。
NSFetchRequest     ・・・読み出し方法を入れるものこれをつかって NSManagedObjectが順番に入ってる
                                   NSArray が手に入る。
NSManagedObject ・・・1つのデータが入ってるNSDictionary

これらです。要するにObjectContextちゃんへ RequestしてArrayをGetすればいいわけです。
こんな感じ。

NSManagedObjectContext *moc = [self managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *d = [NSEntityDescription entityForName: @"user"  inManagedObjectContext:managedObjectContext_];
[request setEntity:d];

NSError *error = nil;
NSArray *list = [moc executeFetchRequest:request error:&error];
NSManagedObject *resultObject = [list objectAtIndex:0];
[request release];

NSString *result_name = [resultObject valueForKey:@"name"];
NSNumber *result_number = [resultObject valueForKey:@"telnumber"];

さいごのresult_nameとresult_numberが CoreDataに入ってるであろう名前と電話番号の1つ目です。
読み出すだけで大変だなぁ って思うかもしれませんが。
やってることは
「user っていうエンティティにある1つ目のオブジェクトをObjectContextから取り出す」ということです。

全てのデータというかエンティティ(SQLで言うところのテーブル??)は
NSManagedObjectContext
に入ってます。まずはこっから出さないといけません。
取り出すときに必要なのが
・エンティティの名前
です。今回の場合 name っていうエンティティ一覧を手に入れます
それをやってるのが
NSArray *list = [moc executeFetchRequest:request error:&error];
これです。requestには 「nameが欲しい」ってのが入ってます。
mocってのがNSmanagedObjectContextで、 これにrequest渡すとアレイが返ってきます。

requestはエンティティの名前を指定したり ソート順を決めたりするものです。
今回はエンティティの名前だけ指定したので 順番はどうなるか不明です。(おそらく入った順)

このリクエストを実行するとアレイが返ってきますが アレイに入ってるのは
NSManagedObject
です。
これは要するに NSDictionaryみたいなもんです。
だからvalueForKeyで name や telnumber ってやったら値が返ってきます。

簡単でしょ?
もう1回登場人物纏めると

NSManagedObject ・・・1つのデータが入ってるNSDictionary
NSFetchRequest     ・・・読み出し方法を入れるものこれをつかって NSManagedObjectが順番に入ってる
                                   NSArray が手に入る。
NSManagedObjectContext     ・・・これがデータ全体。ここへリクエストを送るとアレイが返ってくる。

これだけです。ちなみにこんなの作ると

-(NSManagedObject *)ObjectEntityName:(NSString *)entityname index:(NSUInteger)index{
NSManagedObjectContext *moc = [self managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *d = [NSEntityDescription entityForName:entityname inManagedObjectContext:managedObjectContext_];
[request setEntity:d];//?
//[d release];

NSError *error = nil;
NSArray *list = [moc executeFetchRequest:request error:&error];
NSManagedObject *resultObject = [list objectAtIndex:index];
[request release];
//[list release];
return resultObject;
}

非常に便利です。情報読み出すときに

NSManagedObject *object = [self ObjetEntityName:@"user" index:0];
NSString *result_name = [object valueForKey:@"name"];
NSNumber *result_number = [object valueForKey:@"telnumber"];

こんなふうに簡単に読み出せます。

[データの書き込み]
書き込みはもっと簡単です

NSManagedObjectContext *context = [self managedObjectContext];
NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:@"user" inManagedObjectContext:context];

[newManagedObject setValue:@"YukiSato" forKey:@"name"];
[newManagedObject setValue:[NSNumber numberwithint:1] forKey:@"telnumber"];
[self saveContext];

新しいNSManagedObjectを userっていうエンティティに作成します。
それに値を代入して保存。
これで終わり^^;

眠たいので続きは今度。
これだけじゃCoreData使えないので、使うためのメソッドを今度紹介します。