CloudKit:CKQuery 显示错误:错误:操作无法完成。 (CKErrorDomain 错误 1。)

Posted

技术标签:

【中文标题】CloudKit:CKQuery 显示错误:错误:操作无法完成。 (CKErrorDomain 错误 1。)【英文标题】:CloudKit : CKQuery showing error: error: The operation couldn’t be completed. (CKErrorDomain error 1.) 【发布时间】:2015-05-31 04:14:04 【问题描述】:

我正在开发实现 cloudkit 的 ios 应用程序,但我需要查询 ID 大于数字的所有记录。例如我有 ID 为 23 的记录:

这是我的代码:

CKContainer *myContainer = [CKContainer containerWithIdentifier:containerID];

    CKDatabase *publicDatabase = [myContainer publicCloudDatabase];


CKRecordID *recordID = [[CKRecordID alloc] initWithRecordName:@"23"];
    CKReference* recordToMatch = [[CKReference alloc] initWithRecordID:recordID action:CKReferenceActionNone];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"recordID >= %@", recordToMatch];
    CKQuery *query = [[CKQuery alloc] initWithRecordType:recordType predicate:predicate];

    [publicDatabase performQuery:query inZoneWithID:nil completionHandler:^(NSArray *results, NSError *error) 
        if (error) 

            NSLog(@"error: %@", error.localizedDescription);
        
        else 

        
    ];

但我收到以下错误:

错误:错误:操作无法完成。 (CKErrorDomain 错误 1。)

你们中的任何人都知道如何设置我的 NSPredicate 以获取 ID 大于 23 的所有记录吗?

非常感谢您的帮助。

【问题讨论】:

为什么要与记录ID进行比较? @AminNegm-Awad 因为我需要 ID 大于 23 或任何给定数字的所有记录 好的,为什么需要 ID 大于给定数字的记录? ID 是一个 ID,没有属性。 @AminNegm-Awad 这正是我试图做的,但确实奏效了。 "recordID.recordName" 我没有说你应该做点什么。所以你不能做,我打算做的。你去了 SO 来解决你的问题。如果你回答问题,事情就会变得更容易。再说一遍:为什么需要 ID 大于给定数字的记录? 【参考方案1】:

对于这样的查询,您可以使用如下谓词:

在斯威夫特中:

var predicate = NSPredicate(format: "recordID >= %@", CKRecordID(recordName: "23"))

在目标 C 中:

 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"recordID >= %@", [CKRecordID initWithRecordName:@"23"]];

然后我假设您最初在指定此数字时创建了 CKRecords 对象。否则,记录ID 值将由 CloudKit 分配,并且将是一个 GUID。

【讨论】:

我尝试了您的解决方案,但出现此错误:字段 '___recordID' 的值类型为 REFERENCE,无法使用过滤器类型 GREATER_THAN_OR_EQUALS 进行查询 那么实现这一点的唯一方法是添加一个具有相同值的额外文本字段,然后只查询该文本字段。 你能举个例子解释一下吗? 创建记录时还要创建并填充字段,例如 myID,然后谓词将是: NSPredicate *predicate = [NSPredicate predicateWithFormat:@"myID >= %@",@"23 "]; 我已经更新了我的原始帖子,因为你提到我已经更改了我的谓词,但我收到错误:操作无法完成。 (CKErrorDomain 错误 1。)【参考方案2】:

您的 23 记录 ID 存储为 CKRecordID 类型而不是数字,因此您不能使用任何数字谓词,例如大于。您应该在记录中创建一个新的数字字段来存储您的整数 ID 并改为查询它。

【讨论】:

以上是关于CloudKit:CKQuery 显示错误:错误:操作无法完成。 (CKErrorDomain 错误 1。)的主要内容,如果未能解决你的问题,请参考以下文章

CloudKit 谓词:使用 CKQuery 的谓词搜索多个参考字段

CloudKit 返回太多记录

带有今天日期的 CKQuery

如何在 tableview 控制器中显示 CloudKit RecordType 实例

CloudKit 服务器拒绝请求:未知字段记录名称

如何在 Swift 中使用“IN”谓词进行 ckQuery?