使用 recordName 获取单个记录,它应该从 icloud 返回特定字段

Posted

技术标签:

【中文标题】使用 recordName 获取单个记录,它应该从 icloud 返回特定字段【英文标题】:Fetch single record using recordName and it should return specific field from icloud 【发布时间】:2015-10-29 11:31:30 【问题描述】:

我想使用 cloudkit 从 icloud 获取单个记录。

这是我正在使用的代码:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"recordName contains %@",recordId];                                       
NSLog(@"predicate------%@",predicate);
CKQuery *query = [[CKQuery alloc] initWithRecordType:@"AmuzItems" predicate:predicate];
CKQueryOperation *queryOperation = [[CKQueryOperation alloc] initWithQuery:query];
queryOperation.database = publicDatabase;
queryOperation.resultsLimit =1 ;
queryOperation.desiredKeys = @[@"name",@"city",@"state"];
queryOperation.recordFetchedBlock = ^(CKRecord * record) 
        NSLog(@"record------%@",record);
;
queryOperation.queryCompletionBlock = ^(CKQueryCursor * cursor, NSError * operationError) 
    if (operationError)                                                                                               NSLog(@"error--------%@",operationError);                                                                                                                                            
  else
    
        NSLog(@"cursor------%@",cursor);
    
;

只想检索name, city, state 字段。 RecordType 中有 15 个字段。代码不返回任何内容,甚至不返回错误。

【问题讨论】:

您可以尝试将 queryOperation.qualityOfService 设置为 .UserInteractive @EdwinVermeer :谢谢回复。我试过了,但没用。之后我使用了 NSOperationQueue。并对 nspredicate 进行一些更改,它就可以工作了。 啊...我错过了那个。您忘记了 [queryOperation start];作为最后一行。 【参考方案1】:

对于像我一样面临同样问题的人:

CKDatabase *publicDatabase = [[CKContainer defaultContainer] publicCloudDatabase];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"recordID == %@",[[CKRecordID alloc]initWithRecordName:recordId]];
CKQuery *query = [[CKQuery alloc] initWithRecordType:@"RecordTypeName" predicate:predicate];
CKQueryOperation *queryOperation = [[CKQueryOperation alloc] initWithQuery:query];
NSOperationQueue * operationQueue = [[NSOperationQueue alloc] init];
queryOperation.database = publicDatabase;
queryOperation.resultsLimit =1 ;
queryOperation.desiredKeys = @[@"name",@"city",@"state"];
queryOperation.recordFetchedBlock = ^(CKRecord * record) 
 NSLog(@"record------%@",record);
;
queryOperation.queryCompletionBlock = ^(CKQueryCursor * cursor, NSError * error) 
    if (error) 
          NSLog(@"error--------%@",error);            
     else
    
        if (cursor) 
            NSLog(@"cursor-------%@",cursor);
        
        else
        
                NSLog(@"end");
        
    
;
 [operationQueue addOperation:queryOperation];

【讨论】:

你不需要 NSOperationQueue。相反,您忘记的是在 queryOperation 上执行 start。 是的。[queryOperation start] 也可以。但是“queryoperation start”和 NSOperationQueue 有什么区别..因为两者在这里以相同的方式工作。 队列是一个可以处理多个操作的容器。数据库中已经有一个可用的队列。相反,您也可以调用 publicDatabase.addOperation(queryOperation) 我不确定在数据库上执行 .start 或使用 addOperation 会有什么好处。我看到大多数示例代码都使用 addOperation。

以上是关于使用 recordName 获取单个记录,它应该从 icloud 返回特定字段的主要内容,如果未能解决你的问题,请参考以下文章

如何从单个输入值中获取分类报告

单个查询从具有不同列的多个表中获取记录

无法从 CloudKit 通知信息和用户信息结构中获取 CKRecord.ID

无法从 firebase 查询 Flutter 中获取单个记录

通过 OleDbConnection 获取单个记录的最佳方法是啥?

从 Postgresql 视图中获取下一条记录