核心数据获取请求和未保存的更改

Posted

技术标签:

【中文标题】核心数据获取请求和未保存的更改【英文标题】:Core Data fetch request and unsaved changes 【发布时间】:2012-07-30 09:32:10 【问题描述】:

我有问题。在获取一些数据和未保存的更改时,我的 ios 应用程序的行为非常奇怪。为了您的兴趣,在与 Web 服务器同步一些数据时会出现整个行为。我想做一个完全同步,然后保存更改。我尝试了一些解决方法,但没有一个工作得足够好。

到问题本身: 我将一些实体与 Web 服务器同步。它们被组织成区域(它们的父级),它们本身位于建筑物中。因此,对于每个实体,我都会查询是否已经存在匹配区域,如果不存在,则创建一个新的。现在的问题是,如果刚刚创建这些区域,我将无法获取它们(因此每次都会创建一个新但相同的区域)。我还有一个问题,一旦通过向其添加新创建的区域来更改它,我就无法再获取正确的建筑物,完全相同的查询的结果突然为空。

我已确保设置了[fetch setIncludePendingChanges:YES],并且我还在使用普通结果模式而不是 NSDictionaryResultType(请参阅:NSDictionaryResultType expression not taking into account newly inserted objects)。

希望有人能帮忙。

【问题讨论】:

您能否提供更多有关如何配置 NSManagedObjectContexts 的详细信息?听起来您可能正在从一个上下文中获取,同时在后台线程上导入另一个上下文。在这种情况下,您需要保存上下文(并合并更改)才能获取刚刚插入的内容。 我可以试试。我不认为我有多个上下文 - 总是使用我的 AppDelegate 中的一个。此外,同步不在后台线程中完成,而是在显示活动指示器的主线程中完成。 是的,所以用您的 NSFetchedResultsController 设置代码更新您的问题。在同步过程中,活动指示器是否响应,即更新和动画流畅? 【参考方案1】:

Fetch 请求从上下文中获取数据,该上下文在从中获取上下文的持久存储中保存数据。当你创建一个新的托管对象时,你是在你的上下文中创建它(也就是你的草稿本),但不是在你的持久存储中。因此,在您获取新创建的对象之前,您必须将该上下文的更改保存到您的存储中。

【讨论】:

根据手册[fetch setIncludePendingChanges:YES] 应该可以解决问题link 那么很可能是关于 Objective-C 类型的谓词。这个discussion 可能会有所帮助【参考方案2】:

假设我理解您的描述是正确的:我认为您获取数据的谓词非常复杂,这会迫使核心数据从持久存储中读取。因此,托管对象上下文中的修改将被忽略。

例如,我们有一个类似的数据模型

Category 1---n Icon

我们想要获取所有类别

    有图标(多于零), 具有属性usableTRUE 的图标 具有属性enabledByAdminTRUE 的图标

我们使用这样的谓词:

NSArray *predicates = @[[NSPredicate predicateWithFormat:@"icons.@count > 0"],
                        [NSPredicate predicateWithFormat:@"ANY icons.usable = 1"],
                        [NSPredicate predicateWithFormat:@"ANY icons.enabledByAdmin = 1"]];

NSCompoundPredicate *cp;
cp = [[NSCompoundPredicate alloc] initWithType:NSAndPredicateType
                                 subpredicates:predicates];

这个复杂的谓词强制核心数据直接从持久存储中读取。

我的解决方案是保存托管对象上下文并在之后获取数据。

【讨论】:

您好!感谢您的评论,但是这个问题很久以前就发生了,从那时起很多事情都发生了变化。我很确定谓词非常简单,例如 idfield = x ,其中 idfield 是自定义字段,而不是 coredata id。我最终自己缓存了它,由于速度问题,无法保存上下文。 嘿帕特曼,悲伤但真实......复杂谓词的问题仍然存在。这是我自己的应用程序的“全新”解决方案。但是,幸运的是您找到了解决方案:)

以上是关于核心数据获取请求和未保存的更改的主要内容,如果未能解决你的问题,请参考以下文章

保存核心数据中断获取请求

核心数据:NSManagedObjectContext 未保存/获取请求失败,直到应用退出和重新启动

核心数据获取请求中需要谓词?

核心数据请求和保存的最佳实践

将更改 NSManagedObject 保存到核心数据失败

对核心数据请求进行升序排序