使用 CloudKit JS 更新记录
Updating a record with CloudKit JS
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')
}
});
我试过这段代码 returns It's working
但是我的记录没有更新,这段代码有什么问题?
要更新记录,您可以使用 recordChangeTag。需要最新的 recordChangeTag。
When you fetch a record from the server, you get the current version
of that record as it exists on the server. However, at any time after
you fetch a record, other users might save a newer version of the
record to the server. Every time a record is saved, the server updates
the record’s change token to a new value. When you save your instance
of the record to the server, the server compares the token in your
record with the token on the server. If the two tokens match, the
server knows that you modified the latest version of the record and
that your changes can be applied right away. If the two tokens do not
match, the server applies the save policy your app specified to
determine how to proceed.
例子
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
是在大多数情况下使用的正确操作类型。
update | Update an existing record. Only the fields you specify are changed.
在您阅读记录和尝试应用新更新之间,其他客户端总是有可能更新记录。 recordChangeTag
是服务器知道您阅读的版本的方式,这就是文档说明您需要在更新操作中发送它的原因。
If operationType is update, set the recordChangeTag key to the value of the existing record [in the record dictionary].
当您尝试更新已被其他人更新的记录时,您将从服务器收到冲突,因为您的 recordChangeTag 是旧的,您应该以您的应用程序中有意义的任何方式处理该冲突。也许您想告诉用户,也许您只想合并更改。
在特殊情况下,您可能希望强制更新成功。在这种情况下,您可以使用 forceUpdate
operationType,告诉服务器忽略冲突并进行此更新,在这种情况下您不必包含 recordChangeTag
.
forceUpdate | Update an existing record regardless of conflicts. Creates a record if it doesn’t exist.
如果您使用正常的 update
operationType 并且收到成功(不是冲突),那么服务器上的记录肯定会更新。如果不是,则说明发生了其他事情。
值得一提的是,您可能会发现在向服务器发送更改时使用 RecordsBatchBuilder 更方便。以下是您可以使用它执行的操作的示例:
myDatabase.newRecordsBatchBuilder()
.createOrUpdate(record1)
.create(record2)
.update(record3)
.forceUpdate(record4)
.delete(record5)
.commit()
如您所见,它为您处理了很多选项。
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')
}
});
我试过这段代码 returns It's working
但是我的记录没有更新,这段代码有什么问题?
要更新记录,您可以使用 recordChangeTag。需要最新的 recordChangeTag。
When you fetch a record from the server, you get the current version of that record as it exists on the server. However, at any time after you fetch a record, other users might save a newer version of the record to the server. Every time a record is saved, the server updates the record’s change token to a new value. When you save your instance of the record to the server, the server compares the token in your record with the token on the server. If the two tokens match, the server knows that you modified the latest version of the record and that your changes can be applied right away. If the two tokens do not match, the server applies the save policy your app specified to determine how to proceed.
例子
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
是在大多数情况下使用的正确操作类型。
update | Update an existing record. Only the fields you specify are changed.
在您阅读记录和尝试应用新更新之间,其他客户端总是有可能更新记录。 recordChangeTag
是服务器知道您阅读的版本的方式,这就是文档说明您需要在更新操作中发送它的原因。
If operationType is update, set the recordChangeTag key to the value of the existing record [in the record dictionary].
当您尝试更新已被其他人更新的记录时,您将从服务器收到冲突,因为您的 recordChangeTag 是旧的,您应该以您的应用程序中有意义的任何方式处理该冲突。也许您想告诉用户,也许您只想合并更改。
在特殊情况下,您可能希望强制更新成功。在这种情况下,您可以使用 forceUpdate
operationType,告诉服务器忽略冲突并进行此更新,在这种情况下您不必包含 recordChangeTag
.
forceUpdate | Update an existing record regardless of conflicts. Creates a record if it doesn’t exist.
如果您使用正常的 update
operationType 并且收到成功(不是冲突),那么服务器上的记录肯定会更新。如果不是,则说明发生了其他事情。
值得一提的是,您可能会发现在向服务器发送更改时使用 RecordsBatchBuilder 更方便。以下是您可以使用它执行的操作的示例:
myDatabase.newRecordsBatchBuilder()
.createOrUpdate(record1)
.create(record2)
.update(record3)
.forceUpdate(record4)
.delete(record5)
.commit()
如您所见,它为您处理了很多选项。