Google云端硬盘中删除的文件夹无法反映在Play Services Drive API

时间:2015-12-06 10:46:44

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

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

我在MetaDataBuffer上检查了isTrashed并且它总是被报告为false。

这是app和驱动器服务器之间的同步问题吗?

这是我使用的查询:

    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();

3 个答案:

答案 0 :(得分:2)

欢迎来到俱乐部:-)。这个问题是GDAA讨论all over the place的已知怪癖(赦免,功能)之一。你看到的是有一个“缓冲”的副作用。您的应用和GooDrive之间的layer。在发布任何与GDAA相关的请求时,您正在与GooPlaySvcs图层进行对话,而该图层不知道其他应用(http://drive.google.com)对云端硬盘做了什么。可能会发生许多奇怪的事情,例如:

1 /使用您的应用创建一个文件夹
 2 /垃圾并使用http://drive.google.com永久删除该文件夹  3 /让你的应用程序在该文件夹中创建一个文件 - 没有任何失败的迹象,文件是在Google的某个文件夹中创建的,永远不会落地

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

使其受控制的另一个选择是将您的文件夹/文件写入appfolder,使其他应用无法访问。然后,甚至你不能从后面删除文件'。但请注意,测试时可能会遇到与应用文件夹相关的problem/issue

祝你好运

答案 1 :(得分:1)

正如Sean所说,GDAA有一个缓存层,可能会导致您的应用获得陈旧的查询结果。 在查询之前确保缓存是最新的方法是调用DriveApi#requestSync。 缓存层允许您的应用在离线时运行。如果设备处于离线状态,则当设备重新联机时,Drive API会上传您的文件。 REST API确实更直接,如果您不关心脱机情况或者很乐意在您的应用程序中处理它,那么它可能是一个不错的选择。 希望这会有所帮助。

答案 2 :(得分:1)

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

在进行需要最新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()));

}

我请求同步。如果成功,我将开始要执行的操作。如果它现在失败,那么我仅记录该事件。