使用CloudKit JS更新记录

时间:2015-08-21 14:56:05

标签: javascript cloudkit cloudkit-web-services

CloudKit JS提供了保存,删除和获取记录的方法,但没有简单的方法来更新现有记录。 documentation解释了如何执行此操作:

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但是我的记录没有更新,这段代码出了什么问题?

2 个答案:

答案 0 :(得分:3)

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

  

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

在您阅读并尝试应用新更新之间,记录始终可能被其他客户更新。 recordChangeTag是服务器知道您读取哪个版本的原因,这就是文档说明您需要在更新操作中发送它的原因。

  

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

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

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

  

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

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

值得一提的是,在向服务器发送更改时,您可能会发现使用RecordsBatchBuilder会更方便。以下是您可以使用它做的一个示例:

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

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

答案 1 :(得分:2)

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

Documentation

  

从服务器获取记录时,您将获得当前版本   该记录存在于服务器上。但是,之后的任何时间   您获取记录,其他用户可能会保存更新版本的   记录到服务器。每次保存记录时,服务器都会更新   记录的更改标记为新值。保存实例时   记录到服务器,服务器比较您的令牌   记录服务器上的令牌。如果两个令牌匹配,那么   服务器知道您修改了最新版本的记录   您的更改可以立即应用。如果两个令牌没有   匹配,服务器应用您的应用指定的保存策略   确定如何继续。

示例

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