エンティティが 1 対 1 の必須逆関係を持つ一意性制約を持つことができないのはなぜですか? 2 つのエンティティがある場合:
- 人
プロパティ名
関係: 部門 (1 対 1、オプションではない)
- 部門
プロパティ: タイトル (一意制約)
関係: 人 (対多、オプション)
モデルは iOS 9、XCode 7.0.1 ではコンパイルされず、エンティティの構成が間違っているというエラーが発生します。
エンティティの設定ミス: エンティティ Department は、一意性制約と 1 対 1 の必須逆関係 Person.department を持つことができません。
アップデート:質問は XCode 8.3.1 でも引き続き適用されます。
ベストアンサー1
短い答え:
根本的な問題は、おそらく sqlite 標準によって発生しています。それについてはよくわかりません。しかし、sqlite の制限が原因である可能性が非常に高いです。インターネットで、1 つのテーブルに複数の制約があるという問題を抱えている投稿をいくつか見つけました。これが、2 つのテーブルによる回避策が機能する理由である可能性が高いです。
長い答え:
かなり遅くなりましたが、とにかくお役に立てれば幸いです。
これは、エンティティに一意制約と必須関係がある場合に発生します。iOS 9.0 で追加された一意制約の動作が原因だと思います。ただし、次の 2 つの方法で解決できます。
一意の制約を削除するか、関係をオプションにします。オプションの関係をコードで処理することもできますが、これは良い解決策ではありません。
または
回避策を使用できます。両方持つこともできます。一意制約を持つスーパークラスを作成できます。ただし、これも問題なく機能するわけではありません。
3 つのエンティティ A、B、C があるとします。
A はスーパークラスで、B は A のサブクラス、C も A のサブクラスです。A には、そのプロパティ primaryKey に対する一意の制約があります。B と C のインスタンスを保存するとき、同じ primaryKey を持つ B と C を持つことはできません。CoreData は両方を A として管理するためです。
A を変更して、次の 2 つのプロパティを持つことができます。
- int: originalPrimaryKey (一意制約なし)
- 文字列: primaryKey (一意制約)
これで、primaryKeys を originalPrimaryKey にマップできるようになり、originalPrimaryKey を設定するときに、文字列 primaryKey プロパティを CLASS_NAME.{originalPrimaryKey} に設定できるようになりました。これにより、期待どおりの動作が可能になります。ただし、primaryKeys の回避策を追加する必要があります。