iOS CoreData を使用しながら、デバッグをする際の注意点

CoreData を使って見ているのですが、なかなか便利ですね。特に、Updateの際に、NSManagedObjectのオブジェクトのデータを書き換えるだけで、データが反映されるのはいいです。ときどき、動作がおかしいと思うことがあったので、注意点を備忘として記載しておきます。

  1. NSManagedObjectContextのセーブをする必要がある
  2. 今回のプロジェクトでは、共用のmanagedObjectを作成して、それを、

    • アプリがバックグラウンドに映る際
    • アプリが終了する際

    に保存するようにしています。これをしないと、ローカルでは変更されているように見えても、次回アプリを起動した時に、データが保存されなくなってしまいます。
    こんな感じです。

    - (void)applicationDidEnterBackground:(UIApplication *)application
    {
    [self saveContext];
    }

    - (void)applicationWillTerminate:(UIApplication *)application
    {
    // Saves changes in the application's managed object context before the application terminates.
    [self saveContext];
    }

    - (void)saveContext
    {
    NSError *error = nil;
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
    if (managedObjectContext != nil)
    {
    if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error])
    {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
    }
    }
    }

  3. デバッグ中に保存されない場合は、正しくデータの保存処理が呼ばれて呼ばれていない可能性がある
  4. これで少し迷ったのですが、デバッグ中に、Xcodeのストップボタンを押した時には、上の、

    - (void)applicationWillTerminate:(UIApplication *)application
    - (void)applicationDidEnterBackground:(UIApplication *)application

    が呼ばれないので、データが保存されません。その場合は、直前の変更が無かったことになってしまいます。

分かっていれば難しくないのですが、忘れていると、”保存されたデータが無くなった”を感じてしまうことがあったので、備忘で記録しておきます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください