使用 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 返回特定字段的主要内容,如果未能解决你的问题,请参考以下文章