CKQueryOperation获得最后一条记录

时间:2014-12-01 19:31:16

标签: iphone xcode icloud cloudkit ckquery

我需要获取cloudkit中的最后一条记录。这是我的代码:

 CKContainer *container = [CKContainer containerWithIdentifier:containerID];
    CKDatabase *publicDatabase = [container publicCloudDatabase];
    CKQuery *query = [[CKQuery alloc] initWithRecordType:recordType
                                               predicate:[NSPredicate predicateWithFormat:@"TRUEPREDICATE"]];
     CKQueryOperation *queryOp = [[CKQueryOperation alloc] initWithQuery:query];

    queryOp.desiredKeys = @[@"record.recordID.recordName"];
    queryOp.recordFetchedBlock = ^(CKRecord *record)
    {
        //do something
    };

     queryOp.queryCompletionBlock = ^(CKQueryCursor *cursor, NSError *error)
    {
        NSLog(@"CKQueryCursor  error %@", error);
    };

    queryOp.resultsLimit = CKQueryOperationMaximumResults;
    [publicDatabase addOperation:queryOp];

我的问题是如何修改我的代码以获取cloudkit中的最后一条记录?

我真的很感谢你的帮助

3 个答案:

答案 0 :(得分:4)

您可以对创建数据升序进行排序,然后只需要查询1个结果(代码在Swift中):

添加排序:

query.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]

限制结果:

queryOp.resultsLimit = 1

答案 1 :(得分:1)

Objective-C版

    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO];
query.sortDescriptors = @[sortDescriptor];

一条记录:

queryOp.resultsLimit = 1;

答案 2 :(得分:0)

设置resultsLimit似乎对我不起作用,但无论如何设置它并使用时间戳或记录创建日期对结果进行排序。然后将结果存储在一个数组中,只需使用第一个或最后一个项目,具体取决于排序顺序

    CKContainer *container = [CKContainer containerWithIdentifier:containerID];
    CKDatabase *publicDatabase = [container publicCloudDatabase];
    CKQuery *query = [[CKQuery alloc] initWithRecordType:recordType predicate:[NSPredicate predicateWithFormat:@"TRUEPREDICATE"]];

    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO];
    query.sortDescriptors = @[sortDescriptor];

    CKQueryOperation *queryOp = [[CKQueryOperation alloc] initWithQuery:query];
    queryOp.desiredKeys = @[@"record.recordID.recordName"];
    queryOp.recordFetchedBlock = ^(CKRecord *record)
    {
        //do something
        recordArray.append(record)
    };

    queryOp.queryCompletionBlock = ^(CKQueryCursor *cursor, NSError *error)
    {
        NSLog(@"CKQueryCursor  error %@", error);
        let myLastRecord = recordArray[recordArray.count - 1]
    };

    queryOp.resultsLimit = CKQueryOperationMaximumResults;
    [publicDatabase addOperation:queryOp];