2017-01-29 5 views
0

NSManagedObjectを更新するのに非常に単純なコードを使用していますが、保存によって永続ストア(SQLite)に変更されません。エラーメッセージはありません。ログは大丈夫ですので、少し失われています。コアデータの更新は保存されず、エラーも発生しません。なぜですか?

以下に示すように、私は可能な限りコードを縮小して問題を切り分けました。

ログでは、orderNumberとstatusが正しく設定されていることと、配列のデバッグ出力がすべて正しいことがわかりますが、単純な更新はエラーもなく失敗します。

+ (int) synchOrderWithStatusUpdate:(NSString *)orderNumber : (int)status { 
    if ([NWTillHelper isDebug] == 1) { 
     NSNumber *statusCheck = [NSNumber numberWithInt:status]; 
     NSLog(@"WebServices:synchOrderWithStatusUpdate:ordernumber = %@, status = %d, status2 = %@", orderNumber, status, statusCheck); 
    } 

    synchOrderErrorCode = 0; 

    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate]; 

    NSManagedObjectContext *context = appDelegate.persistentContainer.viewContext; 

    // *** The query for all tables uses orderNumber as selection so we set that up first for re use 
    NSPredicate *predicateOrderNumber =[NSPredicate predicateWithFormat:@"orderNumber like[cd] %@", [NWTillHelper getCurrentOrderNumber]]; 

    NSFetchRequest *fetchRequestOh = [[NSFetchRequest alloc] initWithEntityName:@"OrderHead"]; 
    NSFetchRequest *fetchRequestOrp = [[NSFetchRequest alloc] initWithEntityName:@"OrderRow"]; 
    NSFetchRequest *fetchRequestTender = [[NSFetchRequest alloc] initWithEntityName:@"Tender"]; 

    fetchRequestOh.predicate = predicateOrderNumber; 
    fetchRequestOrp.predicate = predicateOrderNumber; 
    fetchRequestTender.predicate = predicateOrderNumber; 

    fetchRequestOh.resultType = NSDictionaryResultType; 
    fetchRequestOrp.resultType = NSDictionaryResultType; 
    fetchRequestTender.resultType = NSDictionaryResultType; 

    NSError *errorOh = nil; 
    NSMutableArray *orderHeads = [[context executeFetchRequest:fetchRequestOh error:&errorOh] mutableCopy]; 

    NSError *errorOrp = nil; 
    NSArray *orderRows = [[context executeFetchRequest:fetchRequestOrp error:&errorOrp] mutableCopy]; 

    NSError *errorTender = nil; 
    NSArray *tenderRows = [[context executeFetchRequest:fetchRequestTender error:&errorTender] mutableCopy]; 

    if ([NWTillHelper isDebug] == 1) { 
     NSLog(@"WebServices:synchOrderWithStatusUpdate:orderHeadsArray: %@", [orderHeads objectAtIndex:0]); 
     NSLog(@"WebServices:synchOrderWithStatusUpdate:orderRowsArray: %@", orderRows); 
     NSLog(@"WebServices:synchOrderWithStatusUpdate:tenderRowsArray: %@", tenderRows); 
    } 

    // *** Set the status before upload since this dictates what will happen in backend 
    // *** regardless if synch is successful or not 
    NSManagedObject *orderHeadObject = nil; 
    orderHeadObject = [orderHeads objectAtIndex:0]; 
    [orderHeadObject setValue:[NSNumber numberWithInt:status] forKey:@"status"]; 

    // Save the objects to persistent store 
    NSError *error = Nil; 
    [context save:&error]; 

    NSLog(@"Jongel Error = %@", error); 

    if(error !=nil) { 
     if([NWTillHelper isDebug] == 1) { 
      NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]); 
     } 
     synchOrderErrorCode = 99; 
    } 

    return 10101; 
+0

どのようなエラーが発生しましたか?どのエラーですか? – shallowThought

+0

私の質問で述べたように、フェッチリクエストではなく、セーブ自体からでもなくエラーもなく、どちらのエラーでもNULLが表示され、コードはエラーなしで単純に終了します –

+0

Ah。私はこれを逃した、申し訳ありません。 – shallowThought

答えて

1

orderHeadsは辞書としてフェッチされます。 NSManagedObjectContextは、辞書に加えられた変更を認識しません。 NSManagedObjectContextだけがNSManagedObjectContextによって管理されるため、名前は;-)

NSManagedObjectとしてorderHeadObjectを取得しようとすると、変更をストアに戻すことができます。 JSONシリアライゼーション用の辞書が必要な場合:変更を加えた後、辞書として再度取得してください。オブジェクトのすべての値がすでにキャッシュされているため、2回目のフェッチは非常に高速になるため、CoreDataはデータベースから再ロードする必要はありません。

+0

魅力的なように働いていますが、あなたが示唆したようにIDを使用して取得するにはどうすればよいですか?私は述語で2番目のフェッチを行うことができますが、あなたのアイデアはより速く聞こえます –

+0

申し訳ありませんが、私は混乱していました...オブジェクトIDをコンテキストから取得できますが、おそらく、オブジェクトIDを持つ述語を作成することはできますが、その努力に値するとは思いません。あなたの述語は、おそらく新しいものと同じくらい速く、新しい述語を作成する努力を引いたものです。 – nils

+1

ok cool私はちょうど2回目のフェッチを行います。非常に小さいオブジェクトです。この作業はすべて、終了したらバックグラウンドスレッドで実行されます。 –

関連する問題