1

CloudKit JS 提供了保存、删除和获取记录的方法,但没有简单的方法来更新现有的。该文档解释了如何做到这一点:

var query = {
    operationType : 'forceUpdate',
    recordType: 'List',
    record : {
        recordName : 'TheRecordIWannaUpdate',
        fields: { TheFieldToUpdate: { 'value': 42}}
    }
};
container.publicCloudDatabase.performQuery(query).then(function(response) {
    if(response.hasErrors) {
        console.log(response.errors[0]);
    } else {
        console.log('It's working')
    }
});

我试过这段代码,它返回It's working但是我的记录没有更新,这段代码有什么问题?

4

2 回答 2

3

正如文档所述,update是在大多数情况下使用的正确操作类型。

更新 | 更新现有记录。仅更改您指定的字段。

在您阅读记录并尝试应用新更新之间,记录总是有可能被另一个客户端更新。这recordChangeTag就是服务器如何知道您阅读的版本的方式,这就是文档说明您需要在更新操作中发送它的原因。

如果 operationType 是 update,则将 recordChangeTag 键设置为现有记录的值 [在记录字典中]。

当您尝试更新已由其他人更新的记录时,您将收到来自服务器的冲突,因为您的 recordChangeTag 已旧,您应该以在您的应用程序中有意义的任何方式处理该冲突。也许您想告诉用户,也许您只想合并更改。

在特殊情况下,您可能希望强制更新成功。在这种情况下,您可以使用forceUpdateoperationType,告诉服务器忽略冲突并进行此更新,在这种情况下您不必包含recordChangeTag.

强制更新 | 无论冲突如何,都更新现有记录。如果记录不存在,则创建记录。

如果您使用正常的updateoperationType 并且收到成功(不是冲突),那么肯定应该在服务器上更新记录。如果不是,那么正在发生其他事情。

值得一提的是,在将更改发送到服务器时,您可能会发现使用RecordsBatchBuilder更方便。这是您可以使用它执行的操作的示例:

myDatabase.newRecordsBatchBuilder()
  .createOrUpdate(record1)
  .create(record2)
  .update(record3)
  .forceUpdate(record4)
  .delete(record5)
  .commit()

如您所见,它为您处理了很多选项。

于 2015-09-16T16:59:13.753 回答
2

要更新记录,您可以使用recordChangeTag。需要最新的recordChangeTag

文档

当您从服务器获取记录时,您将获得该记录的当前版本,因为它存在于服务器上。但是,在您获取记录后的任何时候,其他用户都可能将更新版本的记录保存到服务器。每次保存记录时,服务器都会将记录的更改标记更新为新值。当您将记录实例保存到服务器时,服务器会将记录中的令牌与服务器上的令牌进行比较。如果这两个标记匹配,则服务器知道您修改了最新版本的记录并且可以立即应用您的更改。如果两个令牌不匹配,服务器将应用您的应用指定的保存策略来确定如何继续。

例子

var record = {
    recordType: 'List',
    recordName: TheRecordIWannaUpdate,
    recordChangeTag: TheRecordTag,
    fields: {
      TheFieldToUpdate: {
        value: 42
      }
    }
};

保存策略对我不起作用,但您可以添加它。

var options = {  
      zoneName: undefined,
      operationType : 'forceUpdate'
  };

container.publicCloudDatabase.saveRecord(record,options)
    .then(function(response) {
    if(response.hasErrors) {
        console.log(response.errors[0]);
    } else {
        console.log("It's working");
    }
 });
于 2015-08-26T04:32:35.120 回答