NSFRC 核心数据获取最后的记录

Posted

技术标签:

【中文标题】NSFRC 核心数据获取最后的记录【英文标题】:NSFRC core data fetching last records 【发布时间】:2013-11-07 08:27:29 【问题描述】:

假设我在数据库中有这个:

a,b,c,d,e,f(按日期排序)

我想按日期顺序获取它们,并且只获取每个请求中的最后 2 个

所以我会得到:e,f

问题是,如果我使用 fetchLimit,我会得到第一个有序 fetch 而不是最后一个。每次 NSFRC 更改时,我都可以计算偏移量。我还需要使用 NSFRC。

有人知道更好的解决方案吗?

在 SQL 中,我的查询是:

select * from (select * from tblmessage order by sortfield ASC limit 10) order by sortfield DESC;

这就是我想要的,但对于 iosandroid SQLite Query - Getting latest 10 records

【问题讨论】:

【参考方案1】:

只需更改排序顺序并根据需要设置获取限制。如果需要,请反转结果。

fetchRequest.sortDescriptors = 
 @[[NSSortDescriptor sortDescriptorWithKey:@"date" ascending:NO]];
fetchRequest.fetchLimit = 2;

NSArray *final result = [[fetchedObjects reverseObjectEnumerator] allObjects];

当然,我看到您的 FRC 问题并没有通过这种方式解决。如果你有一个平面 FRC,即没有部分,你可以只操作你的 fetchedObjects 数组的索引(用 count-1-i 替换每个索引 i

也许最好的方法是在返回 FRC 之前执行快速获取以确定fetchOffset。我认为使用countForFetchRequest 会非常有效。

NSInteger count = [self.managedObjectContext countForFetchRequest:request];
fetchRequest.sortDescriptors = 
  @[[NSSortDescriptor sortDescriptorWithKey:@"date" ascending:YES]];
fetchRequest.fetchOffset = count-2; 

如果您遵循延迟加载 FRC 的 Apple Core Data 模板模式,性能应该是无可非议的。

【讨论】:

我使用了您提到的第一种方法 :) 现在我正在转换为第二种方法。但我想有一个更好的选择。就像在 SQL 中一样,嵌套查询可以轻松解决这个问题。 我最终使用了第二种方法,即每次刷新获取的对象时都进行计数。好消息是,一旦设置了偏移量,即使以后在 DB 中有更多对象,它也会保留。不需要每次有新对象时都加 1 :)

以上是关于NSFRC 核心数据获取最后的记录的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 Core Data 数据库的最后一条记录?

当我删除核心数据实体的最后一条记录时,为啥我的应用程序崩溃了?

核心数据多线程获取记录

使用魔法记录从核心数据中获取关系实体

核心数据:从过滤元素中获取最新记录

thinkphp 怎么获取多天最后一条记录