为什么iOS通过UIManagedDocument保存Core Data时会延迟?

时间:2012-03-20 15:26:11

标签: objective-c ios sqlite core-data

我正在使用Core Data在SQLite数据库中保留一些信息。我正在使用模拟器进行测试,并使用sqlite3查询数据库并验证我是否存储了我期望的内容。

我所看到的是,数据在我保存之后的15-20秒内才出现在SQLite数据库中。

以下是我将保存减少到的代码:

NSEntityDescription *customerType = [NSEntityDescription entityForName:@"CustomerType" inManagedObjectContext:context];
CustomerType *ct = [[CustomerType alloc]initWithEntity:customerType insertIntoManagedObjectContext:context ];
ct.code = code;

NSError* error = nil;
if (![context save:&error] || error)
    NSLog(@"Saved new customer (error=%@)", [error debugDescription]);

保存操作完成且没有错误。

为什么我看到这种延迟的任何暗示?我的保存操作是否无法正常运行,或者是否将数据持久化为模拟器的工件?

3 个答案:

答案 0 :(得分:5)

因为你应该使用:

    [self.document saveToURL:self.document.fileURL
            forSaveOperation:UIDocumentSaveForOverwriting
           completionHandler:^(BOOL success) {                   
               if (success) {                       
                   NSLog(@"saved");
               } else {                       
                   NSLog(@"unable to save");
               }
               }];

答案 1 :(得分:2)

的解决方案!

我通过NSManagedObjectContext创建UIManagedDocument。为了及时保存数据,我需要保存托管文档,而不仅仅是保存我在托管对象上下文中对对象图所做的更改。

答案 2 :(得分:0)

UIManagedDocument具有嵌套的父/子上下文体系结构。延迟是由于未手动保存父上下文引起的。您所做的只是提交从子上下文到父上下文的更改,而不是从父上下文到持久存储的更改。父上下文的自动保存由运行时不时调用,因此延迟。

修复很简单:按照Flink建议的方式保存文档saveToURL,或者保存 BOTH 子上下文和父上下文。前一种方法更简单,适用于大多数情况。如果要使用第二种方法,请注意正确引用每个上下文。 document.managedObjectContext将为您提供CHILD上下文(在主线程上),document.managedObjectContext.parentContext将为您提供父上下文。