3

この厄介なクラッシュとエラーが発生しています。

このコードを実行すると、クラッシュが発生します。

    Address *address = [[Address alloc] initWithEntity:[NSEntityDescription entityForName:@"Address" inManagedObjectContext:managedObjectContext] insertIntoManagedObjectContext:nil];

        //Crashes here!
        [person addAddressObject:address];

Illegal attempt to establish a relationship 'person' between objects in different contexts

コンソールエラー全体は以下のとおりです。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Illegal attempt to establish a relationship 'person' between objects in different contexts (source = <Address: 0x1f87e270> (entity: Address; id: 0x1f87e2b0 <x-coredata:///Address/t748EE284-0311-4489-9654-1D902EB0D4CC2> ; data: {
    addressLine1 = "";
    addressLine2 = "";
    addressLine3 = "";
    city = "";
    country = "";
    person = nil;
    state = "";
    title = "";
    zip = "";
}) , destination = <Person: 0x1ed9e1e0> (entity: Person; id: 0x1ed9c710 <x-coredata://ED0283A9-A847-407E-BFEC-CF2BF85C6A9C/Person/p1> ; data: {
    address =     (
        "0x1f87e2b0 <x-coredata:///Address/t748EE284-0311-4489-9654-1D902EB0D4CC2>",
        "0x1ed93e70 <x-coredata://ED0283A9-A847-407E-BFEC-CF2BF85C6A9C/Address/p1>"
    );
    favourite = nil;
    firstName = Josh;
    lastName = Kahane;
}))'

これを修正する方法がわかりません。おそらく、2つの異なるmanagedObjectContextsがあると思いますか?ただし、私のアプリでは、次のようにアプリデリゲートで作成されたもののみを参照しています(viewDidLoadで実行)。

if (managedObjectContext == nil)
    {
        managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
        NSLog(@"After managedObjectContext: %@",  managedObjectContext);
    }

不一致をどこから探し始めるかについてのアイデアはありますか?ありがとう。

編集:

新しい発見。アプリがクラッシュする直前に、アドレスと個人の管理対象オブジェクトのコンテキストの両方をNSLoggedしました。(null)直前にチェックを実行してコンテキストがnilの場合に設定したとしても、アドレスコンテキストはです。

4

2 に答える 2

5

あなたはそれをnilに挿入していますmanagedObjectContext

NSManagedObjectContextエンティティに使用するにオブジェクトを挿入する必要があります。すなわちmanagedObjectContext

Addressオブジェクトのallocinit。

OPであなたのコメントを読んでください。

あなたはどちらかすべきです...

必要なすべての値を保存し、確認の時点でAddressオブジェクトを作成し、すべてを一度に挿入します。

または...

オブジェクトを作成して挿入し、すべての関係を作成してから、ユーザーがキャンセルを押した場合は、オブジェクトを削除するだけです。

このエラーを回避するために、これら2つのうちの1つを実行します。

于 2012-12-04T17:25:00.057 に答える
0

あなたが言った:

Address *address = [[Address alloc] initWithEntity:[NSEntityDescription entityForName:@"Address" inManagedObjectContext:managedObjectContext] insertIntoManagedObjectContext:nil];

なぜそれをnilコンテキストに挿入するのですか。nilの代わりに管理対象オブジェクトコンテキストを渡すべきではありません。

于 2012-12-04T17:29:28.513 に答える