Javascript 使用CloudKit JS更新记录

Javascript 使用CloudKit JS更新记录,javascript,cloudkit,cloudkit-web-services,Javascript,Cloudkit,Cloudkit Web Services,CloudKitJS提供了保存、删除和获取记录的方法,但是没有简单的方法来更新现有的记录。说明了如何执行此操作: var query = { operationType : 'forceUpdate', recordType: 'List', record : { recordName : 'TheRecordIWannaUpdate', fields: { TheFieldToUpdate: { 'value': 42}} } }

CloudKitJS提供了保存、删除和获取记录的方法,但是没有简单的方法来更新现有的记录。说明了如何执行此操作:

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

我尝试了这段代码,它返回
它正在工作
但是我的记录没有更新,这段代码有什么问题?

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

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

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

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

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

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

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

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

forceUpdate |更新现有记录,而不考虑冲突。如果记录不存在,则创建该记录

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

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

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

正如您所见,它为您处理许多选项。

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

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

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

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

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

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

forceUpdate |更新现有记录,而不考虑冲突。如果记录不存在,则创建该记录

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

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

myDatabase.newRecordsBatchBuilder()
  .createOrUpdate(record1)
  .create(record2)
  .update(record3)
  .forceUpdate(record4)
  .delete(record5)
  .commit()
正如您所看到的,它为您处理许多选项