11

我有一个包含 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 的情况下重写查询,以防万一出现问题,因为性能不应该成为问题。但我想知道是否有人对错误可能在哪里有想法。

4

2 回答 2

14

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

于 2013-03-28T11:51:31.180 回答
0

这个问题确实似乎与 NSManagedObjectContext 中未保存的更改有关。如果您将includesPendingChanges属性设置为false具有限制 + 偏移量的 NSFetchRequest 将按预期工作。

fetchRequest.includesPendingChanges = false
于 2021-03-28T15:37:18.417 回答