managedObjectContext保存不立即插入?

时间:2012-07-07 21:25:39

标签: objective-c ios xcode nsmanagedobjectcontext

我有这个委托方法:

- (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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

使用UIManagedDocument时,只需保存它:

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