当前位置: 首页 > 知识库问答 >
问题:

将SQLlite数据库备份/恢复到Google Drive应用文件夹

夏侯弘光
2023-03-14

我正在尝试将备份和恢复应用程序数据库的功能整合到google drives应用程序文件夹中(对用户不可见)。我浏览了为android提供的基本设置指南,可以让用户授权应用程序,并到达onConnected方法被调用的点。

我面临的问题是,我不知道如何将数据库文件(.db)从设备“发送”到googledrive-app文件夹。谷歌分享了创建新文件的片段,但仅此而已。我确实发现了一个之前被问到的问题,这个问题与我正在寻找的Google驱动器相似,它可以备份和恢复数据库以及Android应用程序的共享首选项,但又不是我想要的。

搜索谷歌可能不会返回任何有用的链接,因为这是一个相对较新的api。

更新1:

共享onConnted()代码,

    public void onConnected(Bundle bundle) {
    Toast.makeText(GoogleSignIn.this, "In onConnected activity", Toast.LENGTH_SHORT).show();

    // Testing to see if database is indeed uploaded to google drive app folder
    String db_name = "XXX_DB";
    String currentDBPath = "/data/" + "com.abc.efg" + "/databases/" + db_name;
    saveToDrive(
            Drive.DriveApi.getAppFolder(mGoogleApiClientDrive),
            "XXX_DB.db",
            "application/x-sqlite3",
            new java.io.File(currentDBPath)
    );
}

更新2:

下面分享的解决方案非常适合将数据库上传到google drive应用程序文件夹。对于那些可能面临类似问题的人,请尝试将数据库路径更改为< code > "/data/data/com . ABC . EFG/databases/" db _ name ,而不是< code > "/data/com . ABC . EFG/databases/" db _ name

下一步是能够从谷歌驱动器应用程序文件夹中检索和恢复数据库。如果我能让它工作,将更新这个问题。

共有1个答案

南宫阳冰
2023-03-14

假设您有一个MyDbFile.db文件的路径,您可以使用这样的构造:

 ... 
 saveToDrive(
   Drive.DriveApi.getAppFolder(getGoogleApiClient()),
   "MyDbFile.db", 
   "application/x-sqlite3",
   new java.io.File("\...\...\...\MyDbFile.db")
 );
 ...

DriveId mDriveId;
/******************************************************************
 * create file in GOODrive
 * @param pFldr parent's ID
 * @param titl  file name
 * @param mime  file mime type  (application/x-sqlite3)
 * @param file  file (with content) to create
 */
void saveToDrive(final DriveFolder pFldr, final String titl,
                 final String mime, final java.io.File file) {
  if (getGoogleApiClient() != null && pFldr != null && titl != null && mime != null && file != null) try {
    // create content from file
    Drive.DriveApi.newDriveContents(getGoogleApiClient()).setResultCallback(new ResultCallback<DriveContentsResult>() {
      @Override
      public void onResult(DriveContentsResult driveContentsResult) {
        DriveContents cont = driveContentsResult != null && driveContentsResult.getStatus().isSuccess() ?
          driveContentsResult.getDriveContents() : null;

        // write file to content, chunk by chunk
        if (cont != null) try {
          OutputStream oos = cont.getOutputStream();
          if (oos != null) try {
            InputStream is = new FileInputStream(file);
            byte[] buf = new byte[4096];
            int c;
            while ((c = is.read(buf, 0, buf.length)) > 0) {
              oos.write(buf, 0, c);
              oos.flush();
            }
          }
          finally { oos.close();}

          // content's COOL, create metadata
          MetadataChangeSet meta = new Builder().setTitle(titl).setMimeType(mime).build();

          // now create file on GooDrive
          pFldr.createFile(getGoogleApiClient(), meta, cont).setResultCallback(new ResultCallback<DriveFileResult>() {
            @Override
            public void onResult(DriveFileResult driveFileResult) {
              if (driveFileResult != null && driveFileResult.getStatus().isSuccess()) {
                DriveFile dFil = driveFileResult != null && driveFileResult.getStatus().isSuccess() ?
                  driveFileResult.getDriveFile() : null;
                if (dFil != null) {
                  // BINGO , file uploaded
                  dFil.getMetadata(getGoogleApiClient()).setResultCallback(new ResultCallback<MetadataResult>() {
                    @Override
                    public void onResult(MetadataResult metadataResult) {
                      if (metadataResult != null && metadataResult.getStatus().isSuccess()) {
                        DriveId mDriveId = metadataResult.getMetadata().getDriveId();
                      }
                    }
                  });
                }
              } else { /* report error */     }
            }
          });
        } catch (Exception e) { e.printStackTrace(); }
      }
    });
  } catch (Exception e) { e.printStackTrace(); }
}

/*******************************************************************
 * get file contents
 */
void readFromGooDrive() {
  byte[] buf = null;
  if (getGoogleApiClient() != null && getGoogleApiClient().isConnected()) try {
    DriveFile df = Drive.DriveApi.getFile(getGoogleApiClient(), mDriveId);
    df.open(getGoogleApiClient(), DriveFile.MODE_READ_ONLY, null)
      .setResultCallback(new ResultCallback<DriveContentsResult>() {
      @Override
      public void onResult(DriveContentsResult driveContentsResult) {
        if ((driveContentsResult != null) && driveContentsResult.getStatus().isSuccess()) {
          DriveContents cont = driveContentsResult.getDriveContents();
          // DUMP cont.getInputStream() to your DB file
          cont.discard(getGoogleApiClient());    // or cont.commit();  they are equiv if READONLY
        }
      }
    });
  } catch (Exception e) { e.printStackTrace(); }
}

祝你好运

 类似资料:
  • 本文向大家介绍数据库备份与恢复,包括了数据库备份与恢复的使用技巧和注意事项,需要的朋友参考一下 必须备份数据库,以防原始数据库由于任何原因损坏或丢失。使用此备份,可以恢复故障之前的数据库。 数据库备份基本上意味着为了安全起见,将创建数据库信息和数据的副本并将其存储在备份服务器中。事务日志也与数据库数据一起存储在备份中,因为没有它们,数据将无用。 数据库失败的原因 数据库故障可能有多种原因,因此需要

  • 问题内容: 我已经卸载了旧的XAMPP并删除了其中的所有内容并安装了新的XAMPP 。当我将备份文件夹(具有我的数据库名称,包含所有和文件)复制到时,该数据库显示在phpmyadmin的列表中,但没有表和数据。我做错了什么? 问题答案: 我搜了很多。还有一些其他文件需要恢复。我认为仅从.frm文件中恢复表是不可能的。我已经重新创建了数据库。

  • 升级、备份和恢复 数据库升级 数据库升级的推荐方案是,老版本的数据库的数据备份成 SQL 脚本的方式,在新版本的数据库上执行这些 SQL 来恢复数据。 使用 Script 工具备份数据 备份数据库有多种方式。如可以直接拷贝数据库文件,但是不建议在数据库在使用的时候去拷贝文件,另外数据库文件是二进制的,不能直接读懂,并且数据库文件可能会比较大,推荐的备份方式是创建压缩的 SQL 脚本文件,并且 H2

  • 到目前为止,我一直在使用备份我的postgresql数据,它将数据导出到sql文件,然后使用

  • Redis SAVE 命令用于创建当前数据库的备份。 语法 redis Save 命令基本语法如下: redis 127.0.0.1:6379> SAVE 实例 redis 127.0.0.1:6379> SAVE OK 该命令将在 redis 安装目录中创建dump.rdb文件。 恢复数据 如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可。

  • 主要内容:Redis 数据备份与恢复,1.SAVE 命令,2.恢复数据,3.BgsaveRedis 数据备份与恢复 1.SAVE 命令 Redis SAVE 命令用于创建当前数据库的备份。 实例 2.恢复数据 如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可。获取 redis 目录可以使用 CONFIG 命令,如下所示: 以上命令 CONFIG GET dir 输出的 redis 安装目录为 /usr/local/redis/bin。