设置 CKReference 未保存

Posted

技术标签:

【中文标题】设置 CKReference 未保存【英文标题】:Setting CKReference is not saved 【发布时间】:2019-10-30 21:44:02 【问题描述】:

在 CloudKit 仪表板中,记录类型 User 有一个名为 Boards 的类型为 Reference (List) 的字段,记录类型 Board 有一个名为 User 的类型为 Reference 的字段。这是一个代码示例,说明我如何尝试将 Board 链接到 User

CKReference *reference = [[CKReference alloc] initWithRecord:userRecord action:CKReferenceActionDeleteSelf];
[boardRecord setObject:reference forKey:@"User"];

如果我在设置对象之前和之后NSLog(@"%@", [boardRecord objectForKey:@"User"]);,我之前得到(null) 的结果,之后是CKReference 对象,recordNameUser 相同。但是在 CloudKit 仪表板中,Board 不会更新其User 字段,并且User 没有将引用添加到其Boards 引用列表中,因此当我随后查询User 以获取关联的@987654340 @s 我没有收到任何结果。我不明白为什么根据记录的内容正确设置了引用,但实际上并没有保存。

这是用于保存到 iCloud 的代码:

+ (void)saveEntity:(CloudKitEntity *)entity completion:(void (^)(NSError * _Nonnull))completion 
    [[self privateDatabase] saveRecord:entity.record completionHandler:^(CKRecord * _Nullable record, NSError * _Nullable error) 
        if (completion) 
            completion(error);
        
    ];

记录错误显示“服务器记录已更改”的错误,我认为这意味着记录的服务器版本比本地版本更新。但我不知道该怎么办,因为我刚刚清理/重建,删除了应用程序并重建/重新安装并收到相同的错误。

【问题讨论】:

【参考方案1】:

解决方案是使用它们的recordIDs 再次获取两条记录,然后设置创建CKReference 并使用重新获取 对象设置它,然后保存重新提取的对象。为什么它需要这么复杂我不知道。

【讨论】:

以上是关于设置 CKReference 未保存的主要内容,如果未能解决你的问题,请参考以下文章

如何从 CKReference 对象中获取引用字符串

CloudKit - 在 CKRecord 中存储多个 CKReference

从 CloudKit 获取包括 CKReference 的数据

CKReference .DeleteSelf 属性无效

CloudKit 上的 CKReference 使用 Swift

从 CKReference 中获取 CKReference 对象