LoginSignup
2
0

More than 3 years have passed since last update.

CoreDataのInverseが存在しない場合に追加するとどうなるか検証した

Posted at

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は厄介
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0