2012-08-03 55 views
1

我在我的项目中使用核心数据,我要用户填写的表格保存到核心数据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 

那么我怎么才能得到提交后的通知或东西,所以用户将无法退出应用程序,直到保存?

+0

它似乎并不像你对我应该知道什么时候提交发生。在保存发生之前系统是否会杀死你的应用程序,或者你是从Xcode中杀死它? – 2012-08-03 12:14:37

+0

比方说用户决定立即终止该应用后,他/她看到了有关全成警报保存 – NikGreen 2012-08-03 12:19:43

+0

坦率地说,你不知道你有一个问题 - 你只是担心你可能有一个。我可以建议您在真实手机上运行测试用例,按照您的说法执行操作 - 按住主界面按钮并尽快终止应用程序 - 然后查看重新启动数据时是否缺失。我怀疑它会正常工作 - 当“保存”成功返回时,苹果将确保数据实际上已被保存。如果它不是一个严重的Apple错误。另外,你是否真的认为用户会放弃所有的应用程序?也许开发人员做的只是“普通”用户不这么做(他们可能会切换到不同的应用程序)。 – 2012-08-03 13:23:29

回答

2

您可以从您的上下文中注册NSManagedObjectContextDidSaveNotification以了解上下文已保存的时间,或者您可以观察属性hasChanges的KVO通知。我怀疑这些会为后台工作,所以他们可能无法解决你的问题。

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 

解决了这个问题。

0

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

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

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

这意味着你不应该需要通知的提交的数据已经安全在该点之前,只是没有合并到主文件。