CoreData: 多対1の定義と保存

CoreData で多対多の定義方法は分かったのですが、多対1についてがよく分からず、いろいろ調べたところようやくわかりました。

まず、多対1とは何だ?ですが、お買い物をした時のレシートでいうと、店名、明細部分の商品名などに当たります。図書館のカードで言うと、書名部分でしょうか。データベースを作るときに、多対1の関係性はよく発生します。

多対1の定義の方法ですが、フィールドをどのように定義するのか分からなかったのですが、結論を言うとフィールドの定義は必要ありません。代わって、Relationship の設定が必要で、逆に言うと、Relationship の設定ができていれば保存できます。RDB を扱っていると、マスターの sequence number を保存しておくためのフィールドを定義しなくちゃとか思いがちですが、その必要はないと。何だか拍子抜けしました。

次に、マスターのレコードを特定できたとして、何を保存するのか、ということですが、entityname.relationshipname = record という形にすれば保存できます。つまり、relationship がフィールドを兼ねていて、そこにマスターのレコードを代入する形でポインタが保存され、プログラマとしては分かりやすく、後の処理は coredata が引き受けてくれるということです。

これ、かなり便利な反面、そこまでやってくれることに気づくまでは分かりにくい仕様だなと思います。

と言うことで、多対多も多対1もどんとこい、ということで・・・

ヴェポライザーでシャグ:Zibb

近所(と言っても、自転車で 30 分以上かかる)に手巻きタバコが豊富においてあるとのことで、昨日は日曜日ということもあり、自転車で行ってきました。噂の通り品揃えが豊富で、今までで一番多いんじゃないかと思いました。紙巻を含めて 500 種類ほどあるそうです。

これだけ多くあると、いろいろ買ってみたくなり、3 袋も買ってしまいました。一時的に、手持ちのシャグ が 8 袋になってしまったのですが、頑張って消費して、それでも 6 袋あります。買ったシャグ をすぐ開けないで、開けたのから順に消費しないと大変だなと。

さて、昨日買ったのは Zibb、Pueblo オレンジ、RAW オーガニックの 3 つ。Zibb が一番 g が少なく 15g なので、まずこれから試してみることに。葉はカラカラに乾燥していて、他の人のレビューを読むと割と湿っていて加湿の必要がないとの情報が多いのですが、どうやら、売れていなくて店頭に並んでいるうちに乾燥が進んだんだろうと思います。ヴェポライザー の場合、無着香の葉は乾燥気味の方が美味しかったりするので、そのまま吸ってみました。

バージニアでしょうね、すごく甘くて美味しいです。コクがあり焼き鳥のたれのような味で、吸っているとヨダレがダラダラ出ます。キック感がいまいちなんですが味がすごくいいです。これ気に入ったのでまた買おうかなと思いました。あまり売ってなくて、入手しようとすると、またあの店まで片道 30 分かけて買いに行かないとならないので、そこがちょっと難点なんですが・・・

ヴェポライザーでシャグ:Pepe green rich

MANITOU gold はキック感、鼻腔ピリピリ感は申し分ないのですが、香りが足りずどうも合わないなと・・・30g なので頑張って消費しようと思います。これを続けているとなんとも物足りないと言うか、別の味も欲しくなってしまい、ついまた買ってしまいました・・・これで手持ち 5 袋となり、もう、これは消費に努めないとならないので慎重に慎重を重ね厳選した結果、Pepe green rich が味濃くて良いらしいとのことで、買ってみました。

うん、これはよかった。酸味が強くキック感がある。でも、甘みがちょっと足りないような・・・でも、飽きる感じはしなかったので、MANITOU と交互に吸えば結構いい感じかもしれないなと。

Pepe は通勤途中のタバコ屋で前からおいてある銘柄だったので、もっと早く試せばよかったなと。

オレオレシャグ ランキング

1. RAW Classic

2. Pepe green rich

3. Colts clear menthol

4. Akropolis fine cut

 

ヴェポライザーでシャグ:Akropolis fine cut

先日評判の良い Akropolis fine cut を買いました。感想は、なんというか、非常に複雑な味です。端的に表現すると、梅酒のような味わいです。酸味があり、キック感があり、ちょっとだけ香ばしく、甘みは少ない。梅酒と正露丸を混ぜたような味と言うのでしょうか。

と書くと、それは美味いのか?と訝る方もいらっしゃるでしょう。決してまずくはなくて美味い部類であることは間違いありません。でも、梅干しが嫌いな自分としては、それほど美味いものにも思えずで、なんだか複雑な気分です。

シャグ 探しの旅はまだまだ先が長そうで・・・

ヴェポライザーでシャグ:MANITOU gold

ヴェポライザー で評判の良いシャグ を探していたら、MANITOU gold を知って、試してみたくて我慢できずに買ってしまいました。

スパイシーというか、ヒリピリ感がすごいですね。あと、ちょっと酸っぱい感じに思いました。甘みは少ないような。でも、複雑な味が混ざっていて、なんか癖になります。

葉はかなり乾燥しているので、加湿した後どうなるかまた試してみたいと思います。

ヴェポライザーでシャグ:Bi Bo fine cut

タバコ屋て試しに吸わせてもらえた。
このタバコ、高くてとても買えそうにないので試せてよかったです。
試してみたら、あ、この香りなんか覚えあるぞ、なんたっけー、思い出せました。

ヨーグルトですね。

それほど強い香りでなくて飽きがこない、いくらでも吸える香りの加減。
感心したのがキック感けっこうあること。
やっぱり銘柄によるね。
気に入ったけど、値段が高すぎなので買っても年一回とかだろうなぁ。

UITableView で object を追加した直後に削除すると error

またハマりました。UITableView で insertObject し、直後にその object を削除すると error。エラーメッセージがまた大層なもので、こんな感じ。

[error] error: Serious application error.  Exception was caught during Core Data change processing.  This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification.

何これ? CoreData のバグじゃないのと思ったんだけど、そうではなくて、beginUpdate を実行していなかったから。以下の method に書いておくべき。

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller

ところで、beginUpdate したら、endUpdate はどうするの?と思ったらそれは次の method で実装していた。

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller

endUpdate しているのに、対となる beginUpdate が宣言されていないのでエラーになっていたというわけ。試しに、begin も end もコメントにしてみたらエラーは出なくなる。これ、なくてもなくても良いものなのだろうか。Apple の Document 読んでみたら、insert, delete とかするときは begin-end の block を使わないと table attribute such as row count とかがおかしくなっちゃうよ、とあるので、書いおいたほうがよさそう。も少し詳しく調べてみたら、例えば、ある行を削除すると index は前に詰まりますが、begin-end block 内では削除前の index を保持しているそうです。ちょっと高尚なことをしようとすると、削除前の index も参照したいよねということはあり得る話。なので、やっぱり begin-end block を使えということ。ただ、エラーにならないので必須ではないと。もちろん、自身のエラーのように、begin-end のどちらか一方だけというのは論外・・・

この TableView は storyboard に手動で追加したものなので、必要な method は自分で書かなければならず、色々と漏れている method があるなと。

さて、次は アプリのプログラムに必要なデータで、category table の data を iCloud から取ってくるか・・・