CoreData分页查询问题详解?

关于coreData 分页查询的问题。

NSMutableArray * temArray = [[NSMutableArray alloc]init];
    NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext];
    NSPredicate *trackTableFilter;
    trackTableFilter = [NSPredicate predicateWithFormat:@"latest_status=%@", @"InTransit"];
      //获取查询条件
        NSFetchRequest * request = [TrackTable MR_requestAllWithPredicate:trackTableFilter inContext: context];
        //设置排序字段
        NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"isTopDate" ascending:YES];
        //设置排序数组
        NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
        [request setSortDescriptors:sortDescriptors];
        [request setIncludesPendingChanges:YES];
        //设置分页查询数目
        [request setFetchLimit:10];
        //设置查询起始
        [request setFetchOffset:pageCount*10];//问题出在这一部分:假如数据有 15 条数据,用户上拉加载至第二页的时候,数据库的所有数据已经全部加载完毕,此时再加入1 条数据(也就是第 16 条数据),这是用户再使用上拉加载的功能的时候,无法加载出第二条数据,因为现在的 pageCount已经是第2 页了,应该是从第 20 条开始加载,但是现在数据库只有 16 条数据,无法加载第16 条数据。我不知道怎么解决了。恳请帮助。非常感谢。🙏。
        //执行查询语句 并返回数组
        NSArray * arrayss = [TrackTable MR_executeFetchRequest:request];

想尝试使用类似于 select id >XX limit 10,但是 CoreData 不知道如何实现。

阅读 628
avatarAI BotBETA

你的问题确实与CoreData的分页查询有关,并且你遇到的问题是如何处理当数据库数据变化时,分页查询的偏移量应该如何调整。

在CoreData中,分页查询通常使用NSFetchRequestfetchOffsetfetchLimit属性来实现。但是,你的问题在于,当数据发生变化时,如何调整这个偏移量。

一个常见的解决方案是,每次查询数据库时,都获取数据库中的总数据条数,然后根据这个总数据条数来计算偏移量。这样,即使数据库中的数据发生变化,你也能正确地获取到下一页的数据。

你可以通过执行一个不设置fetchLimitfetchOffset的查询来获取总数据条数,然后计算偏移量。以下是一个示例代码:

// 获取总数据条数
NSFetchRequest *totalRequest = [TrackTable MR_requestAllWithPredicate:trackTableFilter inContext:context];
[totalRequest setFetchLimit:0]; // 不限制数量
[totalRequest setReturnsObjectsAsFaults:NO]; // 不需要对象,只需要数量
NSNumber *total = [[TrackTable MR_executeFetchRequest:totalRequest] count];

// 计算偏移量
NSUInteger offset = pageCount * 10;
if (offset >= total.unsignedIntegerValue) {
    // 如果已经到达最后一页或者超出总数据条数,不再加载更多数据
    return;
}

// 设置分页查询数目和查询起始
[request setFetchLimit:10];
[request setFetchOffset:offset];

// 执行查询语句 并返回数组
NSArray *arrayss = [TrackTable MR_executeFetchRequest:request];

这样,即使数据库中的数据发生变化,你也能正确地获取到下一页的数据。

注意,这个解决方案有一个前提,那就是每次查询数据库时,都需要执行一个额外的查询来获取总数据条数。这可能会对性能产生一些影响,特别是在数据量很大或者网络状况不佳的情况下。因此,你可能需要根据你的实际情况来选择最合适的解决方案。

1 个回答
✓ 已被采纳

可以把 fetchOffset 设置成当前数据量。
[request setFetchOffset:count];
第一次查询,count0,加载下一页时,count10,再加载下一页时count15

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题