У меня есть относительно простая база данных sqlite с основными данными. Я пытаюсь получать результаты из БД по одной странице за раз.
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)