【问题标题】:CKQueryOperation get the last recordCKQueryOperation 获取最后一条记录
【发布时间】:2015-01-29 21:27:35
【问题描述】:

我需要获取 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 中的最后一条记录?

非常感谢您的帮助

【问题讨论】:

    标签: iphone xcode icloud cloudkit ckquery


    【解决方案1】:

    设置 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];
    

    【讨论】:

      【解决方案2】:

      Objective-C 版本

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

      一条记录:

      queryOp.resultsLimit = 1;
      

      【讨论】:

        【解决方案3】:

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

        添加排序:

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

        限制结果:

        queryOp.resultsLimit = 1
        

        【讨论】:

        • resultsLimit 似乎对我没有影响
        猜你喜欢
        • 2012-02-13
        • 2012-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-28
        • 1970-01-01
        • 2021-06-25
        相关资源
        最近更新 更多