简体   繁体   中英

Google Drive Sqlite db file upload from android app

I'm able to upload database to Drive using the following post. Drive API - Download/upload sql database

But I'm not able to access it directly offline without using app.

Aim: Use the db file further in different application so I want it to be in a usable format whenever I download the content directly from google drive.

I am using MODE_WRITE_ONLY to upload the file to drive from within app

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

My db size is 44kb when I access from external sd card on phone, however it shows 40kb when I see on drive. Please suggest what can I do to make it readable so that I can directly open it in an sqlite browser because when I open it shows "File not recognized".

Do I have to make changes in the WRITE only part or mime type for db file. Please suggest what could be the problem.

I have to admit, I have no idea what you're asking. But since I've successfully tested an SQLite file upload to GooDrive, I can post a piece of code that does it:

Let's assume, there is a SQLite file on your android device:

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

Then you can call this method:

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;
}

To create a "temp.db" SQLite file in the root of your GooDrive.

You can certainly supply a different parent folder (instead of Drive.DriveApi.getRootFolder(GAC) ) if you need to place your file in a different location.

I hope that this is what you wanted to accomplish. Good Luck

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM