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
 }  

我尝试使用-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 回答
0

我认为提交是当底层 SQL 数据库将预写日志的内容提交到主文件时,但预写日志保存在单独的持久文件中,因此从数据库保存的那一刻起它应该是安全的。

如果您检查容器,您将看到每个核心数据存储有 3 个文件(至少在某些时候)。

Foo.sqlite- 主数据库 Foo.sqlite-shm- 共享内存/缓存文件,一次性的。 Foo.sqlite-wal- 预写日志。如果存在且非空,则它包含尚未写入主数据库的最新更改,但如果查询需要,仍将从其中返回结果。

这意味着您不需要收到提交通知,因为在此之前数据已经是安全的,只是没有合并到主文件中。

于 2018-02-28T12:33:15.727 回答