我正在使用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]);
保存操作完成且没有错误。
为什么我看到这种延迟的任何暗示?我的保存操作是否无法正常运行,或者是否将数据持久化为模拟器的工件?
答案 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
将为您提供父上下文。