1

プロジェクトで Core Data を使用しており、ユーザーが入力したフォームを Core Data DB に保存する必要があります。ユーザーがアプリを再起動すると、保存されたフォームのリストが TableView に表示されます。ただし、Core Data が変更をコミットする前にユーザーがアプリを終了すると、フォームは保存されません。データがコミットされた瞬間を捉える方法はありますか?

これは私がフォームを保存する方法です:

if (![document.managedObjectContext save: &error]) {
    NSLog(@"DB saving error!");
}
else {
   NSLog(@"DB save OK!");
   //show alertView
 }  

を使用して Core Data コミットの瞬間を追跡しようとしました-com.apple.CoreData.SQLDebug 1。ログは、約 15 秒後にオブジェクトの保存を開始したことを示しています。

 // This is how my log output looks like
 2012-08-03 14:50:43.587 iPadAF_new[4506:707] DB save OK!
 2012-08-03 14:50:58.628 iPadAF_new[4506:2597] CoreData: sql: COMMIT

では、コミット後に通知などを受け取るにはどうすればよいのでしょうか。ユーザーは保存するまでアプリを終了できません。

4

3 に答える 3

2

コンテキストから NSManagedObjectContextDidSaveNotification に登録して、コンテキストがいつ保存されたかを確認したり、プロパティの KVO 通知を確認したりできますhasChanges。ただし、それらがバックグラウンドで機能するとは思えないため、問題を解決できない可能性があります。

于 2012-08-03T12:52:15.330 に答える
0

コア データ テンプレートに示されているように、コンテキストを AppDelegate に保存する必要があります。

- (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]) {
             // Replace this implementation with code to handle the error appropriately.
             // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        } 
    }
}

私にとっては、コンテキストも保存します

- (void)applicationDidEnterBackground:(UIApplication *)application

問題を解決します。

于 2012-08-03T12:27:29.257 に答える