新しいモデルのバージョンで、既存のアプリケーションに固有の制約を導入します。コアデータ固有の制約 - 保存時に「無効なオブジェクトへの参照のダングリング」
モデルには、エンティティPetとオプションの一対一の関係を持つentity Personがあります。 Personの削除ルールはカスケードであり、Petの逆関係削除ルールは無効です。 Personには1対1の関係もある別のエンティティ、Jobがあります。しかし、削除ルールと逆削除ルールはどちらも無効です。
Personには、私が独自に作成した「personID」プロパティがあります。
メインキューコンテキストでは、IDがxxxのPersonインスタンスがあり、Petが設定されていません。その人を「Charlie」と呼ぶことにしましょう。私もJobを作成し、それを "iOS Dev"として設定し、それをCharlieの仕事のプロパティに割り当てます。
子のプライベートキューコンテキストでは、ID xxx(ユニーク制約)の新しい「Charlie」を挿入し、Petを作成して設定します。私は仕事を設定しません。私は問題なしで子のコンテキストを保存します。
直後、メインキューコンテキストを保存しようとしました。しかし、その直前に、メインキューコンテキストのinsertedObjectsプロパティを調べて、期待どおりID xxxのPersonのインスタンスを確認します。私が期待しているのは、この2番目のインスタンスが一意の制約によって処理され、前の段落の元のPersonインスタンスとマージされるということです。しかし、私は実際にMOCのsaveを呼び出すとき、:メソッドを、それが例外をスローし、私はNSErrorオブジェクトを調べる:
エラードメイン= NSCocoaErrorDomainコード= 1550「操作が を完了できませんでした(ココアエラー1550。 ) "UserInfo = { 無効なオブジェクトへの参照のダングル= null
例外を回避する方法はありますか?私はコアデータの中の「ダングリングリファレンス」に慣れていますが、関係が誤って設定されていることを意味しますが、何度もそれを繰り返してきていますので、それ以外は何をトラブルシューティングするか分かりません。 NSMergeByPropertyObjectTrumpMergePolicyマージポリシーを使用して、すべてのコンテキストを関連付ける必要があります。
明らかにこれは従うことが少し難しいですので、私はケースの誰にGithubの上でサンプルプロジェクトを投げたことは興味を持っている:https://github.com/bpapa/core-data-unique-bug
私の場合、Xcode 8.2にアップグレードすると問題が消えました! – bruce1337
これは良いことです。私のアプリケーションでは、私自身のマージポリシーを書いてもそれを修正していないことがわかったので、実際にはユニークな機能に頼るのをやめてしまった。つまり、たくさんの余分な作成または更新のコードがあり、コアデータに保存する私の操作。うまくいけば、私はこれを再訪することができます。 – bpapa
10月29日に私の喜ばしいコメントを撤回する必要があります。この問題は復讐して戻ってきました。私は今、シミュレータの内容をリセットしたので、1550の参照エラーが消えてしまったように見えます。私の場合、コンテンツがサーバーからリフレッシュされ、アプリケーションがCore Dataの既存のオブジェクトを更新しようとすると、1550になります。 私は今リリースバージョン8.2を使用していますが、まだXcodeのバグが原因ではないと仮定して、問題を解決しようとしています。 – bruce1337