Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 核心数据是否按升序获取最后20条记录?_Ios_Objective C_Core Data_Nsfetchrequest - Fatal编程技术网

Ios 核心数据是否按升序获取最后20条记录?

Ios 核心数据是否按升序获取最后20条记录?,ios,objective-c,core-data,nsfetchrequest,Ios,Objective C,Core Data,Nsfetchrequest,在我的应用程序中,我在核心数据中有一些记录,我想按升序获取最后20条记录,即,如果有30条记录,我想按升序获取11到30条记录- NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"Messages" inManag

在我的应用程序中,我在
核心数据中有一些记录
,我想按升序获取最后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条记录,但这是按升序排列的?如果您有任何建议,我们将不胜感激。

NSFetchRequest
没有为此提供方法。您必须按降序提取20条记录,然后反转生成的数据数组:

dataArray = [[dataArray reverseObjectEnumerator] allObjects];
如果这是为了在表视图中显示,则不是实际反转数据数组 您可以调整
cellforrowatinexpath
方法来显示对象

dataArray[dataArray.count - 1 - indexPath.row]
而不是

dataArray[indexPath.row]
你可以用-

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

你就不能设置这个偏移量吗

//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)谢谢,是的。。。我忘了它是未签名的。。。我的书现在没用了,我来编辑一下。感谢在大型数据集AFAIC上表现不佳的功能