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

时间:2012-07-30 09:32:11

标签: ios save fetch nsfetchrequest

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

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

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

我希望有人可以提供帮助。

2 个答案:

答案 0 :(得分:1)

获取请求从上下文中提取已保存数据的上下文中提取数据。当您创建新的托管对象时,您可以在上下文中创建它(例如,您的临时书),但不是在持久性存储中。因此,在获取新创建的对象之前,必须将该上下文的更改保存到商店中。

答案 1 :(得分:0)

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

例如,我们有一个像

这样的数据模型
Category 1---n Icon

我们想要获取

的所有类别
  1. 有图标(大于零),
  2. 包含属性usableTRUE
  3. 的图标
  4. 包含属性enabledByAdminTRUE
  5. 的图标

    我们使用这样的谓词:

    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];
    

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

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