使用CloudKit JS更新记录



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

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

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

在你读取记录和尝试应用新的更新之间,记录总是有可能被另一个客户端更新。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()

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

要更新记录,您可以使用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");
    }
 });

最新更新