【发布时间】:2011-12-18 19:43:06
【问题描述】:
我有一个比较简单的核心数据 sqlite 数据库。我正在尝试一次从 DB 获取结果。
NSFetchRequest* request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:[...]];
[request setPredicate:[NSPredicate predicateWithFormat:@"flaggedTime != nil"]];
NSSortDescriptor* sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"flaggedTime" ascending:NO];
[request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[request setFetchLimit:pageSize];
[request setFetchOffset:((pageIndex - 1) * pageSize)];
NSArray* results = [self.context executeFetchRequest:request error:NULL];
pageSize 为 30,测试数据上的 pageIndex 为 1、2、3 或 4(DB 中大约有 80 个项目,因此 pageIndex = 4 应该不返回任何项目)。 谓词和排序工作正常,结果成功返回。获取限制也可以正常工作。不返回任何错误。
问题:我总是从第一页得到结果,好像 fetchOffset 没有设置。我试图删除谓词和排序但无济于事。 唯一可以让 fetchOffset 工作的情况是当我使用小于 30 的值时。当然,这对于分页毫无意义......
有人知道为什么吗?我会非常感谢每一个答案。
更新:我说的是 iOS。在 4.2 和 5.0 上测试。
更新 2:简化问题。
NSFetchRequest* request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:[...];
NSError* error = nil;
NSManagedObjectContext* context = [...];
NSUInteger count = [context countForFetchRequest:request error:&error];
assert(error == nil);
NSLog(@"Total count: %u", count);
request.fetchOffset = 0;
request.fetchLimit = 30;
NSLog(@"Fetch offset: %u, limit: %u", request.fetchOffset, request.fetchLimit);
NSArray* page1 = [context executeFetchRequest:request error:&error];
assert(error == nil);
NSLog(@"Page 1 count: %u", page1.count);
request.fetchOffset = 30;
request.fetchLimit = 30;
NSLog(@"Fetch offset: %u, limit: %u", request.fetchOffset, request.fetchLimit);
NSArray* page2 = [context executeFetchRequest:request error:&error];
assert(error == nil);
NSLog(@"Page 2 count: %u", page2.count);
给予:
【问题讨论】:
-
我们能看到你设置pageSize和pageIndex的代码吗?还有,你显示结果的代码?
-
那不相关。问题就在这里。我知道您不相信我,并且您希望在其他地方找到一个简单的解决方案,但是进入该方法的参数就是我上面写的。但我很好奇 - 你真的有一个同时使用 fetchLimit 和 fetchOffset 的工作代码吗?
-
我有使用 fetchLimit、fetchOffset 和 sortDescriptors 的工作代码 - 就像你一样。我的代码工作正常。
-
打开数据库或请求设置有区别吗?我知道文档状态“在嵌套请求(例如子查询)中忽略偏移量”。但我觉得我的要求很简单。
-
@Sulthan 您可能需要共享您的 momd 文件以帮助重现错误。
标签: objective-c ios core-data