12

AとBと呼ぶ2つのエンティティがあります。これらは、両方向にTo-Many関係で構成されているため、A.myBsとB.myAsはどちらもNSSetです。

これが私の奇妙な問題です。

AエンティティにBを追加するときは、次のようにmutableSetValueForKeyを使用して追加します。

NSMutableSet *myBSet = [myA mutableSetValueForKey:@"myBs"];
[myBSet addObject:theBtoAdd];

これにより、theBtoAddがAエンティティに追加されますが、逆の関係は追加されません。Core Dataコンテキスト保存はエラーを発生させませんが、私のAオブジェクトにはB逆セットがありません。アプリケーションを終了すると、部分的な関係も保存されません。

ここに奇妙な部分があります...コードを切り替えて反対のことをすると(特定のアプリケーションでこれを行うのが難しい理由があります)-次のようにBをAに追加する代わりにAをBに追加します:

NSMutableSet *myASet = [myB mutableSetValueForKey:@"myAs"];
[myASet addObject:theAtoAdd];

それはうまく機能します。ちなみに、私には他にもたくさんの関係があります。これだけではありません。

他のいくつかのこと:1)私のコアデータオブジェクトモデルは良さそうですが、これはXcode 4で追加した最初の新しいエンティティです2)カスタムNSManagedObjectsを確認し、再確認し、ブラインドになりましたが、見た目は罰金-宣言された動的、NSSet、競合するセッター/ゲッターなし...など。

ヘルプやデバッグの提案をいただければ幸いです。ありがとうございました!

4

3 に答える 3

7

私はちょうど同じ問題を抱えていたので、この質問を見ました。たぶん私の解決策は同じ状況の何人かの人々を助けるでしょう。

私にとっての答えは、NSManagedObjectサブクラスでオーバーライドしたということでした。

- (void)willChangeValueForKey:(NSString *)inKey withSetMutation:(NSKeyValueSetMutationKind)inMutationKind usingObjects:(NSSet *)inObjects

- (void)didChangeValueForKey:(NSString *)inKey withSetMutation:(NSKeyValueSetMutationKind)inMutationKind usingObjects:(NSSet *)inObjects

これにより、自動逆関係を処理する親クラス(NSManagedObject)に正しい通知が送信されなくなります。

于 2012-01-23T15:12:46.660 に答える
3

これらのメソッドのいずれかをオーバーライドしている場合、エラーが見つかりました

// KVO change notification
- (void)willChangeValueForKey:(NSString *)key;
- (void)didChangeValueForKey:(NSString *)key;
- (void)willChangeValueForKey:(NSString *)inKey withSetMutation:(NSKeyValueSetMutationKind)inMutationKind usingObjects:(NSSet *)inObjects;
- (void)didChangeValueForKey:(NSString *)inKey withSetMutation:(NSKeyValueSetMutationKind)inMutationKind usingObjects:(NSSet *)inObjects;

NSManagedObjectが正常に機能せず、関係が正しく設定されない原因になります

Appleのドキュメント:これらのメソッドをオーバーライドしてはなりません。

于 2016-02-29T14:26:16.977 に答える
0

管理対象オブジェクトをサブクラス化する場合、自動生成された多対多の関係メソッドがあるべきではありませんか?だからあなたはただ電話する必要があるでしょう:

[aObject addBObject:bObject];
于 2011-06-02T18:36:13.333 に答える