将文档上传到Google云端硬盘时检测冲突

时间:2014-02-15 05:39:26

标签: android google-drive-api google-docs merge-conflict-resolution

我的Android应用更新Google云端硬盘文档。该文件也可以在其他地方修改(例如通过Drive web界面),因此文件上传可能存在冲突。但是,这应该很少发生。这就是为什么我不希望我的应用程序首先查询修订历史记录(因为这在大多数情况下是不必要的),只有在此之后,才更新文件。 如何在更新文件时检测到存在冲突?

到目前为止,我的调查显示getHeadRevisionId() returns null虽然是null head revision id has been reported fixed。 我尝试的另一件事是在update()之前的文件上的setEtag()。 It should have given me error on update,但即使文件已远程更改,上传也会成功!这是使用ETag的正确方法吗?

2 个答案:

答案 0 :(得分:1)

“这是使用ETag的正确方法吗?”

此外,对于非Docs文件,您还应该检查md5Checksum是否有对内容的更改。

答案 1 :(得分:1)

设置If-Match HTTP标头:

final Update update = mService.files().update(mDriveFile.getId(), mDriveFile, byteContent);
final HttpHeaders headers = update.getRequestHeaders();
headers.setIfMatch(mDriveFile.getEtag());
update.setRequestHeaders(headers);
mDriveFile = update.execute();

如果同时更改了文档,则更新将被拒绝,其响应类似于:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 412 Precondition Failed
{
  "code": 412,
  "errors": [
    {
      "domain": "global",
      "location": "If-Match",
      "locationType": "header",
      "message": "Precondition Failed",
      "reason": "conditionNotMet"
    }
  ],
  "message": "Precondition Failed"
}

请注意ETag might change even if the content does not