CoreDataでは、Inverseが存在しないとwarningが出る。
これを解消するために逆方向のrelationを貼るわけでが、じゃあその場合に新しく貼ったrelationの値はどうなるの?というのを検証した。
関係ごと
N:N
N:Nのrelationは、片方向のrelationでは作ることが出来ない。
一方にTo Manyでrelationを貼った場合、CoreDataでは自動的に1:Nになる。
データ構造上N:N作れるけど、save()
を呼んだタイミングで勝手に1:Nにされる。
どれが選ばれるかは多分未定義なんじゃないかなぁ。
1:N
1:Nの場合は、元々片方向のrelationのものに新しく双方向relationを追加しても、特に何も問題が起きない。
内部的にはrailsのbelongs_toとかと同じようなデータの持ち方をしているっぽいので、新しく追加してもそのまま参照できる。
1:1
これが厄介。
1:1ではどっちが主体となってデータを持っているとかではなく、双方向にポインタを持っている状態っぽい。
双方向にrelationを貼ってある状態であれば、片方に値を入れれば反対側にも勝手に入るのだが、あとから追加したrelationはnilになってしまう。
lightweight migration でも解決はされないようなので、もしやりたければ heavyweight migration をするしかない。辛い。
まとめ
- N:Nはそもそも作れない。
- 1:Nなら何も問題は起きない
- 1:1は厄介