【问题标题】:Getting a "record to insert already exists" error for CloudKit获取 CloudKit 的“要插入的记录已存在”错误
【发布时间】:2020-09-09 21:41:01
【问题描述】:

当我写入 CloudKit 的公共容器时,我收到以下错误:

CKError 0x283a01a10:“服务器记录已更改”(14/2004); server message = "要插入的记录已经存在"

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

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")
    }
}

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

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

【问题讨论】:

  • 我不认为这就是你使用CKModifyRecordsOperation的方式。如果要新建记录,可以使用perform方法。
  • @ElTomato 谢谢
  • 记录必须是唯一的。我会研究记录代码的创建,并确保记录 ID 是唯一的。

标签: ios swift icloud cloudkit


【解决方案1】:

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

所以你在这里实际上是双重节省。直到 publicCloudDatabase.add(operation) 操作的所有内容都会设置操作,然后启动操作,保存在“let operation =”步骤中标识的记录。

所以如果你停在那里,那么你就可以走了。

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

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

但是因为您的操作没有完成块,所以您永远不会“看到”结果。

尝试添加这个:

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

【讨论】:

  • 如果您需要在一次保存多条记录时采取措施,您还可以添加 perRecordCompletionBlock。
  • 感谢您的回答。我实际上是在向服务器添加一个新条目,而不是修改它。换句话说,条目 A 存在于公共容器的记录中。我想将条目 B 添加到同一条记录中。我还需要获取条目 A 才能添加条目 B 吗?
  • 你不应该这样做,不。我将编辑答案以删除获取/更新位 - 其余的应该解决它我认为
猜你喜欢
  • 2014-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-26
  • 2016-11-26
  • 2023-04-07
相关资源
最近更新 更多