CloudKit 出现 "record to insert already exists" 错误

Getting a "record to insert already exists" error for CloudKit

当我写入 CloudKit 的 public 容器时,出现以下错误:

CKError 0x283a01a10: "Server Record Changed" (14/2004); server message = "record to insert already exists"

我目前正在使用以下代码保存:

let publicCloudDatabase = CKContainer.default().publicCloudDatabase
let operation = CKModifyRecordsOperation(recordsToSave: [exampleRecord], recordIDsToDelete: nil)
let operationConfiguration = CKOperation.Configuration()

operationConfiguration.allowsCellularAccess = true
operationConfiguration.qualityOfService = .userInitiated
operation.configuration = operationConfiguration

publicCloudDatabase.add(operation)
publicCloudDatabase.save(progressRecord) { record, error in
    if let error = error {
        print("\(error)")
    } else {
        print("Success")
    }
}

我在多个帖子中看到,例如 or this,我需要先从服务器获取现有数据,然后在再次上传之前修改它,因为我不应该创建新记录每次。我想知道这是否仅适用于私有容器,因为将其他人的内容提取到您的设备上并在上传之前对其进行修改真的没有意义。如果是这样,为什么我会收到此错误以及如何解决它。

如果是这种情况,那么只在记录中下载我的数据并在上传之前修改它对我来说也没有意义,因为 1) 我并没有真正修改我现有的数据,我是向服务器添加新数据和 2) 错误表明 record 已经存在,这意味着它仍然会说记录已经存在。

听起来您并不希望那里有记录,这是第一次尝试保存记录。在那种情况下,我认为问题是您将便捷方法“.save”与 CKModifyRecordsOperation()

方法结合使用

所以你在这里实际上是双重储蓄。 publicCloudDatabase.add(operation) 动作的所有内容都设置动作,然后开始动作,保存在“let operation =”步骤中识别的记录。

所以如果你到此为止,那么你就可以开始了。

但是因为你随后调用: publicCloudDatabase.save(progressRecord) { 记录,错误在 ///等等

这实际上启动了一个单独的、完全不同的保存 - 因此出现错误!

但是因为您的操作没有完成块,所以您永远不会 'see' 结果返回。

尝试添加这个:

operation.modifyRecordsCompletionBlock = { savedRecords, deletedRecordIDs, error in
    if let error = error {
         //handle error 
    } else {
        //success
    }
}

此行上方:

publicCloudDatabase.add(operation)

这应该可以解决问题! (不要忘记杀死 .save 部分)

同时查看 Apple 文档:https://developer.apple.com/documentation/cloudkit/ckmodifyrecordsoperation