CoreData を使って見ているのですが、なかなか便利ですね。特に、Updateの際に、NSManagedObjectのオブジェクトのデータを書き換えるだけで、データが反映されるのはいいです。ときどき、動作がおかしいと思うことがあったので、注意点を備忘として記載しておきます。
- NSManagedObjectContextのセーブをする必要がある
- アプリがバックグラウンドに映る際
- アプリが終了する際
- デバッグ中に保存されない場合は、正しくデータの保存処理が呼ばれて呼ばれていない可能性がある
今回のプロジェクトでは、共用の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();
}
}
}
これで少し迷ったのですが、デバッグ中に、Xcodeのストップボタンを押した時には、上の、
- (void)applicationWillTerminate:(UIApplication *)application
- (void)applicationDidEnterBackground:(UIApplication *)application
が呼ばれないので、データが保存されません。その場合は、直前の変更が無かったことになってしまいます。
分かっていれば難しくないのですが、忘れていると、”保存されたデータが無くなった”を感じてしまうことがあったので、備忘で記録しておきます。