CloudKit 数据库 fetchRecordWithID 错误

Posted

技术标签:

【中文标题】CloudKit 数据库 fetchRecordWithID 错误【英文标题】:CloudKit database fetchRecordWithID error 【发布时间】:2014-12-21 19:25:44 【问题描述】:

当我想从私人数据库中获取记录时,它会显示这个错误:

传递给 CKFetchRecordsOperation 的意外记录 ID:CKReference:0x7fb691c1c300; 8BBDA567-D00A-4603-91A2-D436677F3952:(_defaultZone:__defaultOwner__)

我不知道为什么。我参考该“所有者”记录从我之前获取的记录中获取了该记录 ID。所以我想从我的参考属性中获取那个记录ID。

我做错了什么吗?

这是我的代码:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"creationDate > %@", upToDate];
CKQuery *query = [[CKQuery alloc] initWithRecordType:@"Car" predicate:predicate];
CKContainer *container = [CKContainer defaultContainer];
CKDatabase *privateDB = [container privateCloudDatabase];
[privateDB performQuery:query inZoneWithID:nil completionHandler:^(NSArray*results, NSError*error)
    for (CKRecord*carRecord in results) 
        CarModel *car = [CarModel new];
        CKRecordID *ownerID = [record objectForKey:@"owner"];

        [privateDB fetchRecordWithID:ownerID completionHandler:^(CKRecord *record, NSError*error)
           // here i expect record with recordID same as recordID in my reference attribute

奇怪的是,当我在仪表板中搜索时,我的错误消息中的 8BBDA567-D00A-4603-91A2-D436677F3952 是正确的 ID。

还有其他获取“所有者”记录的方法吗?

【问题讨论】:

【参考方案1】:

您的 ownerID 应该是 CKReference 类型。然后你必须像这样查询 ownerID.recordID:

CKReference *ownerID = [record objectForKey:@"owner"];
[privateDB fetchRecordWithID:ownerID.recordID completionHandler:^(CKRecord *record, NSError*error)

【讨论】:

非常感谢您的帮助。我总是尝试直接从该引用中生成 CKRecord :) 但是当我在 completionHandler 中有另一个 fetch 并且在那个 fetch 中有另一个 fetch 时我仍然遇到麻烦。那合法吗?当它开始 for (in) 方法时,它总是在第二次获取后停止工作。 也许我必须使用 addOperation 添加另一个提取? 虽然你应该可以嵌套 CloudKit 操作,但我以前见过这种锁定。在我的代码中,我认为我已经通过在主队列上启动内部操作来解决这个问题。 是的,我的意思是github.com/evermeer/EVCloudKitDao 至少 EVCloudData 对象将始终返回到主队列。底层道不会。我想让它更接近 CloudKit 的功能。 好的。我对 swift 不是很熟悉,但也许那里的东西可以帮助我解决我的问题 :) 再感谢一次!圣诞快乐

以上是关于CloudKit 数据库 fetchRecordWithID 错误的主要内容,如果未能解决你的问题,请参考以下文章

CloudKit 数据库查询问题

如何从 CloudKit 查询和获取数据?

通过 cloudKit 云或解析方案数据

CloudKit私有数据库读写工作无需用户登录iCloud

从 CloudKit 获取包括 CKReference 的数据

CloudKit 数据管理