android - Google Drive API 缓存查询结果

标签 android caching google-drive-api

我想检查链接的 Google 云端硬盘帐户的 root 中是否存在文件夹。如果存在,请删除该文件夹中的一个文件并在其中创建一个新文件。如果没有,请创建该文件夹,然后在其中创建一个文件。

这就是我要查询的内容:

private void checkIfBackupFolderIsInDrive(final File databaseFile) {
        final Query backupFolderQuery = new Query.Builder()
                .addFilter(Filters.and(
                        Filters.eq(SearchableField.TITLE, DATABASE_BACKUP_FOLDER_NAME),
                        Filters.eq(SearchableField.MIME_TYPE, DriveFolder.MIME_TYPE),
                        Filters.eq(SearchableField.TRASHED, false)))
                .build();

        mDriveResourceClient.getRootFolder()
                .continueWithTask(task -> {
                    final DriveFolder rootFolder = task.getResult();
                    return mDriveResourceClient.queryChildren(rootFolder, backupFolderQuery);
                })
                .addOnSuccessListener(mActivity, metadataBuffer -> {
                    for (final Metadata metadata : metadataBuffer) {
                        final DriveFolder driveFolder = metadata.getDriveId().asDriveFolder();
                        final String title = metadata.getTitle();
                        final String mimeType = metadata.getMimeType();

                        if (title.equals(DATABASE_BACKUP_FOLDER_NAME) && mimeType.equals(DriveFolder.MIME_TYPE)) {
                            Utils.log("SettingsFragment", "Backup folder already exists");
                            deleteExistingDatabaseFileInFolder(driveFolder, databaseFile);
                            metadataBuffer.release();
                            return;
                        }
                    }

                    metadataBuffer.release();
                    createFolderToRootDriveFolder(databaseFile);
                })
                .addOnFailureListener(mActivity, e -> Utils.log("SettingsFragment", "Error retrieving files list: " + e.getMessage()));
    }

如您所见,我已经在 metadataBuffer 上调用了 release() 方法,但是当我删除最近创建的文件夹时,甚至从废纸篓中清空并然后再次执行查询,它一直说该文件夹已经存在。

如果我不清空垃圾桶,新文件会在垃圾文件夹中创建。

我正在使用这个版本的 drive API 和这个版本的 auth API:

implementation 'com.google.android.gms:play-services-auth:16.0.0'
implementation 'com.google.android.gms:play-services-drive:15.0.1'

这让我抓狂。我怎样才能执行干净的查询来避免这种行为发生?

非常感谢您。

最佳答案

在花费大量精力进行数据研究后,我找到了解决方案。在进行任何需要最新元数据缓冲区的查询/操作之前,您必须调用 DriveClient.requestSync()更新它。

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

public abstract Task<Void> requestSync ()

Requests synchronization with the server to download any metadata changes that have occurred since the last sync with the server.

Typically, this method should be called when the user requests a refresh of their list of files. Once this method returns, performing a query will return fresh results.

In order to avoid excessive load on the device and server, sync requests are rate-limited. If the request has been rate-limited, the operation will fail with the DRIVE_RATE_LIMIT_EXCEEDED status. This indicates that a sync has already occurred recently so there is no need for another. After a sufficient backoff duration, the operation will succeed when re-attempted.

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

}

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

关于android - Google Drive API 缓存查询结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51945492/

相关文章:

Android URIMatcher 问题

java - Android - 使用另一个 Java 类对 TextView 进行排序

java - Android:ActivityNotFoundException 无法找到显式 Activity 类

asp.net sessionID 在回发时更改?

java - 创建缓存时如何将所有缓存名称及其数据放入List<>中?

database - 深度可遍历的 self 中心图的缓存策略

java - startActivity(Intent)后恢复 Activity

python - 在 Python 中收集 webViewLink 和 webContentLink

java - 发布中的 Google Drive API 访问 oauth 客户端 ID

python - 在 Python 中列出所有 Google Drive 文件和文件夹并保存 ID