我一直试图弄清楚我做错了什么,或者它是不是预期的行为。我正在创建一个使用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();
答案 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状态失败。这个 表示最近已经发生同步,因此没有 需要另一个。经过足够的退避时间后,该操作 重新尝试后将成功。
我的实现如下:
private void refreshMetadata(final File databaseFile) {
mDriveClient.requestSync()
.addOnSuccessListener(aVoid -> checkIfBackupFolderIsInDrive(databaseFile))
.addOnFailureListener(e -> Utils.log("SettingsFragment", "Could not update metadata buffer: " + e.getMessage()));
}
我请求同步。如果成功,我将开始要执行的操作。如果它现在失败,那么我仅记录该事件。