代码之家  ›  专栏  ›  技术社区  ›  dontWatchMyProfile

fetch请求是否执行建议的批处理错误?

  •  1
  • dontWatchMyProfile  · 技术社区  · 14 年前

    我很好奇。苹果在文件中说:

    核心数据自动触发故障 必要时(当 访问故障的属性)。 但是,个别点火故障 可能效率低下,而且 获取数据的更好策略 从持久性存储(参见__batch 使用 sqlite存储)。

    nsfetchRequest具有以下功能:

    [fetchRequest setFetchBatchSize:20];
    

    这本质上是在执行类似建议的批处理错误吗?

    仅仅为了让其他人明白这一点,错误并不意味着“变成一个错误”,而是意味着“实现它”,就像“把它变成一个史酷比涂鸦”。在我看来,措辞错误相当难看,但至少在文档中是一致的;)

    2 回复  |  直到 11 年前
        1
  •  3
  •   user23743    14 年前

    文件回答了这个问题,国际海事组织:

    如果您设置了非零的批处理大小, 返回的对象集合 执行的提取被分成 批次。执行提取时, 对整个请求进行评估并 所有匹配对象的标识 已记录,但不超过批量大小 对象数据将从 一次持续存储。数组 从执行请求返回 将是一个代理对象, 透明地故障批处理 需求。(在数据库术语中,这是一个 内存中的光标。)

    对我来说,这意味着它将获取的结果分为在访问批处理的任何成员时出错的批处理。

        2
  •  1
  •   eofster    11 年前

    分批断裂

    你看到的苹果的批量错误建议是关于另一个案例,而不是获取批量大小。

    假设您有一组错误,并且希望在循环中访问它们的属性。每次都会触发一个故障。因此,在迭代之前,您要执行这样配置的获取请求:

    NSFetchRequest *request = ...;
    NSArray *arrayOfFaults = @[faultOne, faultTwo, ...];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF IN %@", arrayOfFaults];
    [request setPredicate:predicate];
    [request setReturnsObjectsAsFaults:NO];
    

    而且,核心数据不仅从持久存储中提取所有数据并填充其内部缓存(由于执行了提取请求),而且还返回完全实现的对象(因为 setReturnsObjectsAsFaults:NO )

    关系预取

    想象一下你有 Department<-->>Employee 模式,然后您就提取了所有员工。然后迭代它们,在每一个循环中,您都会得到一个雇员的部门。每次访问部门时,都会触发关系错误。为了避免这种情况,您可以这样配置提取请求:

    [request setRelationshipKeyPathsForPrefetching:@[@"department"]];