2012-07-30 64 views
1

我遇到问题。我的iOS应用程序在获取某些数据和未保存的更改时表现得非常奇怪。为了您的兴趣,在将某些数据与Web服务器同步时出现整个行为。我想进行完全同步,然后保存更改。我尝试了一些解决方法,但没有一个能够很好地工作。核心数据提取请求和未保存的更改

问题本身: 我使用Web服务器同步一些实体。他们被组织成区域(他们的父母),他们自己在建筑物中。因此,对于每个实体我查询如果一个匹配的区域已经存在,如果没有,我创建一个新的。现在的问题是,如果他们刚刚创建,我无法获取这些区域(所以每次都会创建一个新的但完全相同的区域)。我还遇到了一个问题,即一旦通过向其添加新创建的区域而更改了该区域,我就无法再获取正确的建筑物,而完全相同查询的结果突然变空。

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

我希望有人能帮忙。

+0

你可以提供关于如何配置NSManagedObjectContexts的更多细节吗?这听起来像你可能从一个上下文中获取,而在后台线程中导入到另一个上下文中。在这种情况下,您需要保存上下文(并合并更改)才能获取刚插入的内容。 – 2012-07-30 09:35:52

+0

嗯,我可以尝试。我不认为我有多个上下文 - 总是使用我的AppDelegate中的一个。此外,同步并不是在后台线程中完成,而是在显示活动指示符时在主线程上完成。 – patman 2012-07-31 07:11:31

+0

是的,所以用你的NSFetchedResultsController设置代码更新你的问题。活动指示器是否响应,即在同步过程中更新和平滑动画? – 2012-07-31 09:00:44

回答

1

提取请求从上下文中提取数据,该上下文中的数据存储在上下文从其提取的持久性存储区中的保存的数据。当你创建一个新的托管对象时,你可以在你的上下文(a.k.a.你的scratch book)中创建它,但是不会在你的持久存储中创建它。因此,在您可以获取新创建的对象之前,您必须将该上下文的更改保存到您的商店中。

+3

根据手册'[取setIncludePendingChanges:YES]'应该做的伎俩[链接](http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/CoreDataFramework/Classes/NSFetchRequest_Class/NSFetchRequest。 html) – patman 2012-07-31 07:06:39

+0

那么它很可能是关于Objective-C类型的谓词。此[讨论](http://stackoverflow.com/a/7128251/692507)可能会有所帮助 – 2012-07-31 08:56:16

0

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

例如,我们有一个像

Category 1---n Icon 

的数据模型,我们要取的

  1. 有图标(大于零)所有类别,
  2. 有图标,其属性usableTRUE
  3. 有图标,其属性enabledByAdminTRUE

我们使用谓词是这样的:

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

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

这种复杂谓词力量核心数据从持久存储读取,直接。

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

+0

您好!感谢您的评论,但是这个问题很久以前就出现了,并且自那以后发生了很多变化。我很确定谓词非常简单,就像'idfield = x',其中idfield是一个自定义的而不是coredata id。我最终自己缓存它,因为速度问题,保存上下文是没有选择的。 – patman 2015-04-13 13:41:33

+0

嘿patman,悲伤但真实......复杂谓词的问题依然存在。这是我的应用程序的“全新”解决方案。然而,幸运的是你找到了解决方案:) – 2015-04-13 14:00:06