【问题标题】:core data fetch last 20 records in ascending order?核心数据按升序获取最后 20 条记录?
【发布时间】: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 条记录,但那是按升序排列的?任何建议都将不胜感激。

【问题讨论】:

    标签: ios objective-c core-data nsfetchrequest


    【解决方案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 小于sizecount -= 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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 2015-01-29
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 2017-07-27
      相关资源
      最近更新 更多