gpt4 book ai didi

ios - 核心数据 : SQLite not being updated immediately

转载 作者:行者123 更新时间:2023-11-29 12:02:31 25 4
gpt4 key购买 nike

有两个实体——文档和页面。 Document 与 Page 是一对多的关系。

我在添加文档时保存托管对象上下文。此时,其中没有页面。在调试时我发现 writer context 的 save 方法确实被调用并且执行时没有错误。我关闭并重新打开应用程序,但找不到之前保存的文档对象。但是,如果我在其中一个文档中添加一个页面,那么,Document 对象就会出现在表中。我使用工具查看 SQLite 文件,但我的观察并非基于我在工具中看到的内容。即使当我调试并查看存在的文档数量时,如果其中没有页面,我也会返回 0。

我猜测 Persistent Store Coordinator 正在做某种优化以批量写入。我可以强制它立即写入和更新持久存储吗?在持久存储对象上调用 addPersistentStoreWithType 时是否可以添加一个选项?

注意:仅供引用,我使用 this组织管理对象上下文的模式

解决了这个问题。这是更新因此,我将整个堆栈一直保存到编写器上下文。这个错误非常愚蠢。我试图像这样在主线程上保存主上下文:

- (void)saveMainContext {
[self.mainManagedObjectContext performBlock:^{
// Ensure that the main object context is being saved on the main queue
__block NSError *error = nil;
dispatch_async(dispatch_get_main_queue(), ^{
[self.mainManagedObjectContext save:&error];
});
if(!error)
{
//Write to disk after saving on the main UI context
[self saveWriterContext];
}

}];
}

如您所见,在尝试保存主上下文后,我保存了作者上下文。但是,错误是我没有等待主上下文完成保存。修复错误后,我的代码如下所示:

- (void)saveMainContext {
[self.mainManagedObjectContext performBlock:^{
// Ensure that the main object context is being saved on the main queue
dispatch_async(dispatch_get_main_queue(), ^{
NSError *error = nil;
[self.mainManagedObjectContext save:&error];
if(!error)
{
//Write to disk after saving on the main UI context
[self saveWriterContext];
}
});
}];
}

而且,这解决了问题!我犯了非常愚蠢的错误。

最佳答案

您确定保存了整个堆栈吗?如果您在私有(private)上下文中进行更改,则需要保存该私有(private)上下文。如果您在主上下文中(从 UI)进行更改,则需要保存该上下文。只有在所有其他上下文向 -hasChanges 报告 NO 之后,您才应该保存作者上下文(也就是他设计中的主上下文)。

我怀疑这是你的问题。

对OP的回应

Hmm. Did not know that. Thanks! So, are you suggesting that I may be well off if I do not check for "error" at all, and just check for the save's return?

我的意思是你的保存应该是这样的(注意我也更正了你不必要的 dispatch_async):

- (void)saveMainContext {
[self.mainManagedObjectContext performBlock:^{
// Ensure that the main object context is being saved on the main queue
NSError *error = nil;
if (![[self mainManagedObjectContext] save:&error]) {
NSLog("Failed to save context: %@\n%@", [error localizedDescription], [error userInfo]);
exit(1);
}
[self saveWriterContext];
}];
}

dispatch_async 将被忽略,因为您已经在正确的队列中。

调用 -save: 返回一个 bool。如果并且如果返回NO,您是否对错误使用react。

关于ios - 核心数据 : SQLite not being updated immediately,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36335339/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com