Результаты разбиения на страницы из запросов основных данных

У меня есть относительно простая база данных 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)
19
задан Sulthan 2 November 2011 в 11:09
поделиться