【问题标题】:Possible issue with fetchLimit and fetchOffset in a Core Data query核心数据查询中的 fetchLimit 和 fetchOffset 可能存在问题
【发布时间】:2012-05-30 07:33:13
【问题描述】:

我有一个包含 fetchLimit 和 fetchOffset 的核心数据查询的零星错误。很久很久以前(我已经看到它发生过一次,另一个测试人员也是如此), fetchOffset 似乎被忽略了。查询如下所示:

NSFetchRequest *fetch = [[NSFetchRequest alloc] initWithEntityName:@"MyEntity"];
NSSortDescriptor *dateDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timestamp" ascending:NO];
NSArray *sortDescriptors = [NSArray arrayWithObject:dateDescriptor];
[fetch setSortDescriptors:sortDescriptors];

fetch.fetchOffset = 500;
fetch.fetchLimit = 1;

NSError *error = nil;
NSArray *objects = [self.managedObjectContext executeFetchRequest:fetch error:&error];
if (objects.count) {
    MyEntity *objectAtLimit = [objects objectAtIndex:0];
}

这几乎总是根据需要返回第 501 个对象,但在这两次中断的情况下,它返回了第一个对象。

除非数据库中有 >500 行,否则查询永远不会运行。我正在使用iOS5。 managedObjectContext 有一个 mainQueueConcurrencyType。

这似乎与此问题中报告的行为相同:Paging results from Core Data requests,从未解决(或至少不在列表中。)在这种情况下,根据数据模型,fetchOffset 似乎被忽略或尊重正在接受测试。

我可能会在没有 fetchOffset 的情况下重写查询,以防万一出现问题,因为性能不应该成为问题。但我想知道是否有人对错误可能在哪里有想法。

【问题讨论】:

    标签: objective-c ios core-data


    【解决方案1】:

    今天早上遇到了一个类似的问题,并注意到如果我的 NSManagedObjectContext 有未保存的更改,那么无论出于何种原因,都可能会忽略 fetchOffset。保存上下文后,正确解释 fetchOffset。

    【讨论】:

    • 这也发生在我身上 - 使用单独的“临时上下文”来创建我未保存的记录,以便我的主要上下文保持不变以查询修复它
    • 我得到了类似的东西......但对我来说 CoreData 只允许在一个表中保存 280 行我不知道为什么,我在 CD 上保存 10 个项目的每一页......但是当将页面保存在 280 行旁边,它没有保存任何内容,当我从 CD 检索 281-290 的页面时,我收到了 271 -280 的页面 :(,我正在使用保存上下文,但这种行为很奇怪。跨度>
    【解决方案2】:

    问题确实似乎与 NSManagedObjectContext 中未保存的更改有关。如果您将includesPendingChanges 属性设置为false,则带有limit + offset 的NSFetchRequest 将按预期工作。

    fetchRequest.includesPendingChanges = false
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 2020-04-04
      • 2012-07-19
      • 2011-03-10
      • 2014-07-24
      • 2014-05-07
      相关资源
      最近更新 更多