CloudKit:使用CKModifyRecordsOperation保存记录时出错

时间:2015-04-14 20:43:29

标签: ios cloudkit

<CKError 0x14d8cb70: "Partial Failure" (2/1011); "Failed to modify some records"; partial errors: {
    B5DEF0B5-F064-4B27-9C89-BE75C9134297:(_defaultZone:__defaultOwner__) = <CKError 0x14d83b70: "Server Record Changed" (14/2037); "Error saving record <CKRecordID: 0x15748cd0; B5DEF0B5-F064-4B27-9C89-BE75C9134297:(_defaultZone:__defaultOwner__)> to server: Protection data didn't match">
}>

我尝试将CKRecord保存到CloudKit时出现此错误。有什么想法吗?

我是否必须像在便捷API中那样获取第一个记录?

我正在使用CKModifyRecordsOperation方法更新更多记录。

1 个答案:

答案 0 :(得分:6)

当您计划进行更新时,首先需要阅读记录,进行更改然后编写记录。您收到通知,说明在读取和写入记录之间记录已更改。

如果服务器上的记录版本比您尝试保存的版本新,则服务器返回CKErrorServerRecordChanged错误。错误对象的userInfo字典包含冲突记录的不同版本。使用这些键来检索记录并执行解决冲突所需的任何解析逻辑。

正如您在下面讨论的那样,问题在于您将对象持久保存到数据库并重新创建CKRecord以进行修改。在这种情况下,您需要使用CKRecord encodeSystemFieldsWithCoder持久保存系统字段。并通过使用NSCoder初始化来重新创建CKRecord。您可以使用NSKeyedArchiver和NSKeyedUnarchiver来保存CKRecord并重新创建它。如果您需要样本,请参阅https://github.com/evermeer/EVCloudKitDao/blob/master/AppMessage/AppMessage/CloudKit/EVCloudKitDao.swift底部的fromCKRecord和toCKRecord方法