2012-07-07 39 views
0

我有这样的委托方法:managedObjectContext保存不会立即插入?

- (void)didFinishCreatingTrip:(Trip *)trip 
{ 
    NSLog(@"before"); 
    NSError* error = nil; 
    if (![self.database.managedObjectContext save:&error]) { 
     NSLog(@"%@", error); 
    } 
    NSLog(@"after"); 
} 

当调用该方法,INSERT SQL查询不会立即发生,但约10秒后(根据控制台日志)。这是预期的吗?我能做些什么来立即发生?问题是,当我太早杀死iPhone模拟器时,数据丢失了。

登录:

2012-07-07 23:29:41.702 tripmoney[57542:fb03] before 
2012-07-07 23:29:41.703 tripmoney[57542:fb03] after 
2012-07-07 23:29:54.948 tripmoney[57542:11407] CoreData: sql: BEGIN EXCLUSIVE 
2012-07-07 23:29:54.949 tripmoney[57542:11407] CoreData: sql: SELECT Z_MAX FROM Z_PRIMARYKEY WHERE Z_ENT = ? 
2012-07-07 23:29:54.950 tripmoney[57542:11407] CoreData: sql: UPDATE Z_PRIMARYKEY SET Z_MAX = ? WHERE Z_ENT = ? AND Z_MAX = ? 
2012-07-07 23:29:54.951 tripmoney[57542:11407] CoreData: sql: COMMIT 
2012-07-07 23:29:54.953 tripmoney[57542:11407] CoreData: sql: BEGIN EXCLUSIVE 
2012-07-07 23:29:54.954 tripmoney[57542:11407] CoreData: sql: INSERT INTO ZTRIP(Z_PK, Z_ENT, Z_OPT, ZNAME) VALUES(?, ?, ?, ?) 
2012-07-07 23:29:54.955 tripmoney[57542:11407] CoreData: sql: COMMIT 
2012-07-07 23:29:54.956 tripmoney[57542:11407] CoreData: sql: pragma page_count 
2012-07-07 23:29:54.957 tripmoney[57542:11407] CoreData: annotation: sql execution time: 0.0006s 
2012-07-07 23:29:54.957 tripmoney[57542:11407] CoreData: sql: pragma freelist_count 
2012-07-07 23:29:54.958 tripmoney[57542:11407] CoreData: annotation: sql execution time: 0.0006s 
+0

你肯定当你认为它是被调用这个方法? 10秒是*疯狂*,我也不认为这种方法是异步的。在if块之前和之后放入一个日志,看看它们何时被调用。 – 2012-07-07 21:27:26

+0

用日志编辑。它看起来非常异步。 – 2012-07-07 21:31:47

+0

确实是... – 2012-07-07 21:35:22

回答

0

CoreData作品通过保持你的一些对象的内存缓存。对于它决定保留哪些内容有点神秘,但我认为它可能会保留最近在内存中访问的内容,因此在下一次需要时它不必转到磁盘。这就是内存拷贝返回正确值的原因。我了解您的担忧,但在许多核心数据应用程序中,我从未被这种困扰所困扰。如果您真的担心,请将save添加到您的applicationDidEnterBackground中,并保持活跃状态​​。

0

当使用UIManagedDocument,只需保存:

[document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL];