【问题标题】:Folder deleted on Google Drive doesn't reflect in Play Services Drive API在 Google Drive 上删除的文件夹不会反映在 Play Services Drive API 中
【发布时间】:2018-08-21 18:33:33
【问题描述】:

我一直在试图弄清楚我做错了什么,或者这是否是预期的行为。我正在创建一个使用 Google Play Services Drive API 将文件上传到 Google Drive 的应用程序。在创建父文件夹之前,我会检查该文件夹是否已经存在。为了测试,我删除了文件夹,然后签入应用程序,但应用程序始终检测到该文件夹​​仍然存在。

我检查过 MetaDataBuffer 上的 isTrashed,它总是报告为假。

这是应用程序和驱动服务器之间的同步问题吗?

这是我使用的查询:

    new Query.Builder().addFilter(
       Filters.and(
            Filters.eq(SearchableField.TRASHED, false),
            Filters.eq(SearchableField.MIME_TYPE, MIME_TYPE_FOLDER),
            Filters.eq(SearchableField.TITLE, name)
    )).build();

【问题讨论】:

    标签: android google-drive-api google-drive-android-api


    【解决方案1】:

    欢迎来到俱乐部 :-)。这个问题是GDAA 讨论的all over the place 的已知怪癖(请原谅,功能)之一。你看到的是在你的应用和 GooDrive 之间有一个“缓冲”layer 的副作用。放置任何 GDAA 相关请求时,您正在与 GooPlaySvcs 层交谈,这不知道其他应用程序 (http://drive.google.com) 对驱动器做了什么。可能会发生很多奇怪的事情,例如:

    1/ 使用您的应用创建一个文件夹
    2/ 使用http://drive.google.com删除并永久删除该文件夹
    3/ 让您的应用在该文件夹中创建一个文件 - 没有失败的迹象,文件是在 Google never-never-land 的某个文件夹中创建的

    如果您确实需要了解当前 Drive 状态,则必须使用 REST Api 轮询 Drive。

    控制它的另一个选择是将您的文件夹/文件写入应用文件夹,使其他应用无法访问它们。然后,即使您也不能“从后面”删除文件。不过要小心,有一个相关的problem/issue 与您在测试时可能会遇到的应用文件夹。

    祝你好运

    【讨论】:

    • 谢谢,这就是我想要的。我不确定这是否是我的代码或预期行为中缺少的东西。我遇到的问题是应用程序将这些上传为用户的“备份”。因此,如果用户决定删除我之前上传的文件夹,然后重新上传,我不知道会发生什么行为。这很痛苦,看起来 REST api 可能是更好的选择。
    • REST 非常简单,毫无意外(GDAA 实际上位于它之上)。但是您必须做 GDAA 所做的很多家务(同步服务、管理网络状态等...)
    • 感谢所有帮助。我认为我没有太多选择,同步会让我头疼不已。从用户体验的角度来看,应用程序不知道它是否上传到已删除的文件夹这一事实是一场灾难。再加上用户更有可能责怪应用程序而不是 google drive api 的工作方式这一事实。
    • 当我在here 提出这个问题时,我很惊讶 Google 员工对这个问题如此漠不关心。确切地说,你的应用会受到指责。
    • @FelixD。感受你的痛苦。不幸的是已经帮不上忙了,我一年前退休了,对 GDAA 土地上的情况一无所知。
    【解决方案2】:

    正如 Sean 所提到的,GDAA 有一个缓存层,它可能会导致您的应用获得过时的查询结果。 在查询之前确保缓存是最新的方法是调用 DriveApi#requestSync。 缓存层允许您的应用在离线时运行。如果设备离线,Drive API 会在设备恢复在线时上传您的文件。 REST API 确实更直接,如果您不关心离线案例或乐于在您的应用程序中处理它,它可能是一个不错的选择。 希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      这个问题有点老了,但答案可能对其他有完全相同问题的人有用。

      在进行任何需要最新metadataBuffer 的查询/操作之前,您必须调用DriveClient.requestSync() 进行更新。

      但使用此方法时要小心。根据以下文档:

      public abstract Task<Void> requestSync ()

      请求同步 与服务器一起下载已发生的任何元数据更改 自上次与服务器同步以来。

      通常,当用户请求一个 刷新他们的文件列表。一旦此方法返回,执行 查询将返回新结果。

      为了避免设备和服务器负载过大,同步 请求是有速率限制的。如果请求受到速率限制,则 操作将失败并显示 DRIVE_RATE_LIMIT_EXCEEDED 状态。这个 表示最近已经发生过同步,因此没有 需要另一个。在足够的退避时间后,操作 再次尝试时会成功。

      来源:Google APIs for Android

      我的实现如下:

      private void refreshMetadata(final File databaseFile) {
          mDriveClient.requestSync()
                  .addOnSuccessListener(aVoid -> checkIfBackupFolderIsInDrive(databaseFile))
                  .addOnFailureListener(e -> Utils.log("SettingsFragment", "Could not update metadata buffer: " + e.getMessage()));
      
      }
      

      我请求同步。如果成功,我将开始我想做的操作。如果现在失败,我只会记录事件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-06
        • 1970-01-01
        相关资源
        最近更新 更多