【问题标题】:Android Studio Google Drive AppFolder Backup and Restore (Databases files)Android Studio Google Drive AppFolder 备份和恢复(数据库文件)
【发布时间】:2018-06-25 19:59:17
【问题描述】:

嘿,我在 github 上关注 Google Drive 的 QuickStart:

https://github.com/gsuitedevs/android-samples/blob/master/drive/demos/app/src/main/java/com/google/android/gms/drive/sample/demo/CreateFileInAppFolderActivity.java

我使用了 SCOPE_APPFOLDER,所以当我运行应用程序时,它要求我登录到谷歌帐户并授予打开应用程序文件夹的权限,在我接受后我去谷歌驱动器,是的,它为我的应用程序打开了一个文件夹“应用程序管理器”(1KB)。

我的问题是: 1)如何将数据库文件(我有它的路径)上传到 Google Drive AppFolder? 2)如何下载我将从 AppFolder 上传的那些数据库文件并将它们放在我想要的路径中?

我正在编写一些代码来备份设备内的那些数据库文件但是,它看起来像这样:

    //Back Up 
private void BackUp() {
    try {
        final String inFileName = "/data/user/0/com******/databases/**********";
        File dbFile = new File(inFileName);
        FileInputStream fis = new FileInputStream(dbFile);
        String outFileName = Environment.getExternalStorageDirectory() + "/********";

        // Open the empty db as the output stream
        OutputStream output = new FileOutputStream(outFileName);
        // Transfer bytes from the inputfile to the outputfile
        byte[] buffer = new byte[1024];
        int length;
        while ((length = fis.read(buffer)) > 0) {
            output.write(buffer, 0, length);
        }
        // Close the streams
        output.flush();
        output.close();
        fis.close();
    } catch (Exception e) {

    }
}

如何使用类似上述代码的东西来谷歌驱动 AppFolder????

以下是我用于 Google Drive Stufe 的代码

//Path of the file
 final String inFileName = "/data/user/0/com.******/databases/Categor****";
 File dbFile = new File(inFileName);

我用它来创建 AppFolder:

    private void createFileInAppFolder() {
    final Task<DriveFolder> appFolderTask = getDriveResourceClient().getAppFolder();
    final Task<DriveContents> createContentsTask = getDriveResourceClient().createContents();
    Tasks.whenAll(appFolderTask, createContentsTask)
            .continueWithTask(task -> {
                DriveFolder parent = appFolderTask.getResult();
                DriveContents contents = createContentsTask.getResult();
                OutputStream outputStream = contents.getOutputStream();
                try (Writer writer = new OutputStreamWriter(outputStream)) {
                    writer.write("Hello World!");
                }

                MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
                        .setTitle("New file")
                        .setMimeType("text/plain")
                        .setStarred(true)
                        .build();
                final String inFileName = "/data/user/0/com.camel.work_list/databases/CategoriesSpinner";
                File dbFile = new File(inFileName);
                FileInputStream fis = new FileInputStream(dbFile);

                MetadataChangeSet test = new MetadataChangeSet(fis);

                return getDriveResourceClient().createFile(parent, changeSet, contents);
            })
            .addOnSuccessListener(this,
                    driveFile -> {
                        showMessage(getString(R.string.file_created));
                        //finish();
                    })
            .addOnFailureListener(this, e -> {
                Log.e(TAG, "Unable to create file", e);
                showMessage(getString(R.string.file_create_error));
                //finish();
            });
}

所以我从这段代码中了解到,当它打开 AppFolder 时,它会创建一些带有“Hello World”的文本文件

如何从数据库中获取我的文件并上传到此 AppFolder?以及如何下载/恢复这些文件并将它们放回设备内的 app 文件夹?

谢谢你们:)

【问题讨论】:

  • 你能找到解决办法吗?我也有同样的问题。

标签: android database android-studio database-backups google-drive-android-api


【解决方案1】:
  1. 使用 Application Data 文件夹

应用程序特定文件夹可使用别名访问 应用数据文件夹。此别名可以像任何其他文件夹 ID 一样使用;为了 例如,当列出直接位于您的下方的文件时 应用程序的文件夹或使用 appDataFolder 创建文件时 父母。

将文件插入应用程序数据文件夹

File fileMetadata = new File();
fileMetadata.setName("config.json");
fileMetadata.setParents(Collections.singletonList("appDataFolder"));
java.io.File filePath = new java.io.File("files/config.json");
FileContent mediaContent = new FileContent("application/json", filePath);
File file = driveService.files().create(fileMetadata, mediaContent)
    .setFields("id")
    .execute();
System.out.println("File ID: " + file.getId());
  1. 关注Download Files

    • 下载文件 — files.get with alt=media file resource
    • 下载并导出 Google 文档 — files.export
    • 将用户链接到文件 - 来自文件资源的 webContentLink

【讨论】:

【解决方案2】:

请参阅此官方文档以备份 Google Drive 的私有“应用程序数据”文件夹中的文件。 https://developers.google.com/drive/api/v3/appdata

来自链接的片段:

在应用程序数据文件夹中创建一个文件

File fileMetadata = new File();
fileMetadata.setName("config.json");
fileMetadata.setParents(Collections.singletonList("appDataFolder"));
java.io.File filePath = new java.io.File("files/config.json");
FileContent mediaContent = new FileContent("application/json", filePath);
File file = driveService.files().create(fileMetadata, mediaContent)
    .setFields("id")
    .execute();
System.out.println("File ID: " + file.getId());

在应用程序数据文件夹中搜索文件

FileList files = driveService.files().list()
    .setSpaces("appDataFolder")
    .setFields("nextPageToken, files(id, name)")
    .setPageSize(10)
    .execute();
for (File file : files.getFiles()) {
  System.out.printf("Found file: %s (%s)\n",
      file.getName(), file.getId());
}

使用来自this linkDriverServiceHelper

【讨论】:

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