こんにちは~
さてさて!今回は「CoreData入門」ってことで 難しいこと抜きで
CoreDataは構造を考えるとめんどいのでまずその使い方から。
[CoreDataからデータを読み出す]
いきなりCoreDataからデータを取り出してみましょう。(いれてもないのに出せるか!というツッコミは抜きで)
データモデルのやり方については端折ります。ググッてください。
モデルとしては下の写真にあるように エンティティ「user」に属性
name (nsstring)
telnumber (nsnumber)
があるとしましょう
さて、こんなデータからデータを読み出すわけですが、登場人物が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使えないので、使うためのメソッドを今度紹介します。