У меня есть относительно простая база данных 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 (в базе данных около 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);
дает:
Total count: 34 Fetch offset: 0, limit: 30 Page 1 count: 30 Fetch offset: 30, limit: 30 Page 2 count: 30 (ERROR: should give 4)