2016-04-23 11 views
0

orderDetailconsumeと関連しています。 consumeはここに渡されたパラメータとしてCoreDataContextからフェッチされて存在しました。異なるコンテキストでオブジェクト間の関係「順序」を確立しようとすると、無効な試み

orderDetail = [NSEntityDescription insertNewObjectForEntityForName:@"OrderDetail" inManagedObjectContext:CoreDataContext]; 
orderDetail.order = consume 

しかし、このコードは例外をスロー:私はNSLog

NSLog(@"%@", orderDetail.managedObjectContext); 
NSLog(@"%@", consume.managedObjectContext); 
で例外をチェック異なるコンテキストで

をオブジェクト間の関係 '順序' を確立するため

不正な試みを

それから、私はorderDetail.managedObjectContextが存在しますが、consume.managedObjectContextnil

です。例外がスローされたのはこれですか?なぜこのようなことが起こったのか分かりません。


更新私の質問、詳細情報:

まず
私が持っている私はconsume-entityを削除し、consume-entityを再挿入するとき、これが起こっている

第二に一つだけコンテキスト:
私私は古いをきれいにする

[ CoreDataContext performBlock:^{ 
       [Consume cleanTheContext:CoreDataContext];... 
... ... ... ... 
       for (NSDictionary *consume in consumes) { 
        [Consume consumeWithLecaiInfo:consume inManagedObjectContext:CoreDataContext byUser:user]; 

     }]; 

と呼ばれるデータを受け取ったときに私は、orderDetailを要求し、consumeの関係を確立し、私はこの方法viewWillAppearAにポップとき、私が消費リクエストBのViewController(B viewWillAppear)へのViewControllerをプッシュconsumeconsume新を挿入します(私はconsumeを更新するのではなく、削除して、再度挿入する必要があり知っているが、consumeが、それはこのようにmanagedObjectContextだ失われた理由を私は知らない)

現実に

このエラーがたまに発生し、Aを押してください、ポップB、ポップsh A、pop B ...例外がスローされました。

答えて

0

エラーが自明である、あなたはorderDetailを作成するのと同じ文脈からconsumeオブジェクトを取得するためにあなたのコードを変更することができます。

OrderDetail *orderDetail = [NSEntityDescription insertNewObjectForEntityForName:@"OrderDetail" inManagedObjectContext:CoreDataContext]; 
orderDetail.order = [CoreDataContext objectWithID:consume.objectID]; 

objectID

+0

2番目のコンテキストは 'nil'なので、コンテキスト間でオブジェクトを転送しません。 –

+0

その目的のために任意のコンテキストを使用できます – Azat

+0

何ですか?あなたのコメントは意味をなさない。 OPは明らかに2つのコンテキストを使用していません。 –

0
に1 NSManagedObjectContextからオブジェクトを転送するための適切な方法であります

関係を形成するには、と同じNSManagedObjectContextから両方のオブジェクトを作成する必要があります。

通常、UIが単一のコンテキストを使用する必要があり、オブジェクトの作成にはNSEntityDescription.insert...を使用する必要があるため、これは問題ではありません。あなたがオブジェクトの一つでnilコンテキストを持っているので

は、それはあなたがどこかにnilコンテキストのいずれかでそれを作成しているか、あなたが意図的にNSManagedObjectContext.init...nilを渡していることを意味します。いずれの状況も問題です。

作成コードをトレースし、ブレークポイントを入力します。nilの位置を見つけて修正します。

+0

私はCoreDataContextからコンシューマをフェッチしたので、NSManagedObjectContextが必要です。私はあなたの質問を分析するのに役立つことができます私の質問を更新している。ありがとうございました。 –

+0

私の答えは変わりません。あなたのコードのどこかで、新しい 'Consume'オブジェクトを作成するとき、コンテキストへの参照は' nil'です。作成コードを歩き、 '[[NSManagedObject alloc] init ...]'または '[NSEntityDescription insert ...'を呼び出すとどこにブレークポイントを置いてコンテキストが 'nil'であるかを見つけます。 –

+0

B viewControllerに渡されるコンシューマはmanagedObjectContextを持っていると確信できますが、orderDetailをリクエストしてこのリクエストのコールバックブロックに渡したとき、コールバックブロックでコンテキストを失います。 –

関連する問題