从Android应用程序上传Google Drive Sqlite db文件

时间:2015-12-16 06:10:19

标签: android google-drive-android-api

我可以使用以下帖子将数据库上传到云端硬盘。 Drive API - Download/upload sql database

但是我无法在不使用应用的情况下直接离线访问它。

目标:在不同的应用程序中进一步使用db文件,因此每当我直接从谷歌驱动器下载内容时,我希望它是可用的格式。

我正在使用MODE_WRITE_ONLY将文件从app

上传到驱动器
mfile.open(api, DriveFile.MODE_WRITE_ONLY, new DriveFile.DownloadProgressListener()      
And mime type as this String mimeType = MimeTypeMap.getSingleton().getExtensionFromMimeType("db");

当我从手机上的外部SD卡访问时,我的数据库大小为44kb,但是当我在驱动器上看到它时显示40kb。请建议我可以做些什么来使其可读,以便我可以在sqlite浏览器中直接打开它,因为当我打开它时显示“文件无法识别”。

我是否必须在仅WRITE文件的WRITE部分或mime类型中进行更改。请提出可能存在的问题。

1 个答案:

答案 0 :(得分:4)

我不得不承认,我不知道你在问什么。但是,由于我已经成功测试了一个SQLite文件上传到GooDrive,我可以发布一段代码来实现它:

我们假设您的Android设备上有一个SQLite文件:

java.io.File dbFile = Context.getDatabasePath([YOUR_DB_NAME])

然后你可以调用这个方法:

upload("temp.db", dbFile, "application/x-sqlite3")

com.google.android.gms.common.api.GoogleApiClient GAC;
///...
void upload(final String titl, final File file, final String mime) {
  if (GAC != null && GAC.isConnected() && titl != null  && file != null) try {
    Drive.DriveApi.newDriveContents(GAC).setResultCallback(new ResultCallback<DriveContentsResult>() {
      @Override
      public void onResult(@NonNull DriveContentsResult contRslt) {
        if (contRslt.getStatus().isSuccess()){
          DriveContents cont = contRslt.getDriveContents();
          if (cont != null && file2Os(cont.getOutputStream(), file)) {
            MetadataChangeSet meta = new Builder().setTitle(titl).setMimeType(mime).build();
            Drive.DriveApi.getRootFolder(GAC).createFile(GAC, meta, cont).setResultCallback(
              new ResultCallback<DriveFileResult>() {
                @Override
                public void onResult(@NonNull DriveFileResult fileRslt) {
                  if (fileRslt.getStatus().isSuccess()) {
                    // fileRslt.getDriveFile();   BINGO !!!
                  }
                }
              }
            );
          }
        }
      }
    });
  } catch (Exception e) { e.printStackTrace(); }
}

static boolean file2Os(OutputStream os, File file) {
  boolean bOK = false;
  InputStream is = null;
  if (file != null && os != null) try {
    byte[] buf = new byte[4096];
    is = new FileInputStream(file);
    int c;
    while ((c = is.read(buf, 0, buf.length)) > 0)
      os.write(buf, 0, c);
    bOK = true;
  } catch (Exception e) {e.printStackTrace();}
  finally {
    try {
      os.flush(); os.close();
      if (is != null )is.close();
    } catch (Exception e) {e.printStackTrace();}
  }
  return  bOK;
}

在GooDrive的根目录中创建“temp.db”SQLite文件。

如果您需要将文件放在其他位置,您当然可以提供不同的父文件夹(而不是 Drive.DriveApi.getRootFolder(GAC))。

我希望这是你想要完成的。祝你好运