核心数据按升序获取最后 20 条记录?
Posted
技术标签:
【中文标题】核心数据按升序获取最后 20 条记录?【英文标题】:core data fetch last 20 records in ascending order? 【发布时间】:2014-04-05 08:28:37 【问题描述】:在我的应用程序中,我在core data
中有一些记录,我想按升序获取最后 20 条记录,即如果有 30 条记录,我想按升序获取 11 到 30 的记录 -
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Messages" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setFetchLimit:20];
NSSortDescriptor *sort = [[NSSortDescriptor alloc]
initWithKey:@"messageId" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"((userId == %@) && (frndId == %@) )",uid, fid];
[fetchRequest setPredicate:predicate];
NSError *error;
NSArray* dataArray = [[managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];
for (Messages* msg in dataArray)
//code here
但它会按升序给我前 20 条记录,如果我更改为
NSSortDescriptor *sort = [[NSSortDescriptor alloc]
initWithKey:@"messageId" ascending:NO];
然后我得到了最后 20 条记录,但那是按升序排列的?任何建议都将不胜感激。
【问题讨论】:
【参考方案1】:你不能设置这个偏移量吗?
//assume it fits an nsinteger
NSInteger count = [managedObjectContext countForFetchRequest:fetchRequest /*the one you have above but without limit */ error:&error];
NSUInteger size = 20;
count -= size;
[fetchRequest setFetchOffset:count>0?count:0];
[fetchRequest setFetchLimit:size];
NSArray* dataArray = [managedObjectContext executeFetchRequest:fetchRequest error:&error]
【讨论】:
请注意,如果count
小于size
,count -= size
将导致一个非常大的正数...(尽管+1)
谢谢,是的...我忘了它是未签名的...我的 whek 现在没用了 - 生病编辑它。谢谢【参考方案2】:
你可以使用 -
//your code as it is till this line but with
//NSSortDescriptor *sort = [[NSSortDescriptor alloc]
initWithKey:@"messageId" ascending:NO];
NSArray* dataArray = [[managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];
NSArray *sortedArray;
sortedArray = [dataArray sortedArrayUsingComparator:^NSComparisonResult(id a, id b)
NSString *first = [(Messages*)a messageId];
NSString *second = [(Messages*)b messageId];
return [first compare:second];
];
for (Messages* msg in sortedArray)
//your code
编码愉快:P
【讨论】:
在大型数据集 AFAICS 上表现不佳【参考方案3】:NSFetchRequest
没有为此提供方法。您必须按降序获取 20 条记录,然后反转生成的数据数组:
dataArray = [[dataArray reverseObjectEnumerator] allObjects];
如果这是为了在表格视图中显示,那么实际上不是反转数据数组
您可以调整 cellForRowAtIndexPath
方法来显示对象
dataArray[dataArray.count - 1 - indexPath.row]
而不是
dataArray[indexPath.row]
【讨论】:
以上是关于核心数据按升序获取最后 20 条记录?的主要内容,如果未能解决你的问题,请参考以下文章