2014-04-05 49 views
3

在我的应用我在core data一些记录,我想取最后20条记录升序排列,即如果有30条记录,比我想按升序从11条记录取30 -核心数据以升序获取最后20条记录?

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条记录,但是那是在升序?任何建议,将不胜感激。

回答

3

你可以使用 -

//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

+1

,将大型数据表现不佳集AFAICS –

3

NSFetchRequest没有提供该方法。你必须按降序取20条记录,然后反转得到的数据阵列:

dataArray = [[dataArray reverseObjectEnumerator] allObjects]; 

如果这是在表视图中显示,然后,而不是实际反转数据阵列 你能够适应cellForRowAtIndexPath方法显示对象

dataArray[dataArray.count - 1 - indexPath.row] 

,而不是

dataArray[indexPath.row] 
8

不能你刚才设置此偏移?

//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] 
+0

注意,如果'count'比'size'少,'数 - = size'将导致一个非常大的积极* *号的...(+ 1虽然) –

+0

谢谢是的...我忘了它没有签名...我的whek现在是无用的 - 不适合编辑它。谢谢 –