CoreData、relate 先の N テーブルに record を保存する

CoreData はホント鬼門。以前はまって、かなり理解したつもりなんだけど相変わらず分からなくなってしまう。分からなくなる原因は、automatic で処理される部分があるためで、method 名とかも table の名称に応じて変化するため余計分からなくなる。でも、それを理解していればそういうものとして program 可能で、理解するまでが大変だということ。大変の意味は、体系的に説明して欲しいのだけど、良書がない、と言えば言い過ぎかもだけど、ネットで検索しながらだと断片的な理解の積み重ねになり、一層分からなくなってくると。

まず、1 : N の関係を作って table に field を追加すると。よくあることなんだけど、field はこれでいいかと思っても、program が進むにつれて名前や型を変更したくなったり、field を追加したくなることはよくある話。以前は、model を変更するたびに coredata の h, m file をアップデートしたりして、めんどくセーって感じだったけど、今は、特に出力しなくても dynamic にアップデートしてくれるので、これは便利になったなと。

1 : N で、1 の table に record を追加するのはそう難しい話ではない。template の通りでほぼ出来上がっている状態なので、こちらから何かする必要は少ない。でも、N の table に record を追加するのは骨の折れる話。なぜかと言うと、table の名称に応じて method 名が変わるからで、そういうものと理解があれば難なく勧められるのだけど、知らないとすごいハマる。

例えば、1 の table 名が Event で、N の table 名が Laps だとする。N の table である Laps に record を追加しようとしたら、次のような形になる。

NSManagedObjectContext* managedObjectContext = appDelegate.persistentContainer.viewContext;

        Laps* newLaps = [[Laps alloc] initWithContext:managedObjectContext];

        newLaps.daytime = [NSDate date];

        [_detailItem addToLapsObject:newLaps];

はじめの managedObjectContext からして、???なのだけど、これはこういう物だと理解した方が話が早い。注目すべきは、addToLapsObject で、method 名に table 名が使われれている。分かりやすさの観点から全くお勧めしないけれども、もし、table 名が hoge なら、この method は、addTohogeObject になるであろう。もし、table 名が Apple なら、addToAppleObject となり、同じく、table 名が Majiwakanneeee なら、addToMajiwakanneeeeObject になるだろう。このように、method 名に table 名が使われるので、判読性の観点からも、頭文字は大文字にすべきだろう、いや、table 名に応じて method 名が使われるのだ、ということをよく覚えておいた方が良い。

こういうことを自動でやってくれるところに CoreData の真髄があるわけで、え、何それ と思わなくはないけれども、理解があれば、すごい便利な機能だなとも思う。

ちなみに、addToXXXObject は N に record を追加するわけだけれども、間に挿入するにはどうするのだ?という疑問に応えるため、insertObject:inXXXAtIndex: という method も自動で作られる。ここの XXX は relationship 名なので、add とは異なる。用意周到だな、ということと、これ、普通わかんないよね。