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

从android应用程序上传Google Drive Sqlite db文件,android,google-drive-android-api,Android,Google Drive Android Api,我能够上传数据库到驱动器使用以下文章。 但如果不使用应用程序,我无法直接脱机访问它 目标:在不同的应用程序中进一步使用db文件,因此每当我直接从google drive下载内容时,我希望它的格式可用 我正在使用MODE_WRITE_仅从应用程序内将文件上载到驱动器 mfile.open(api, DriveFile.MODE_WRITE_ONLY, new DriveFile.DownloadProgressListener() And mime type as this Stri

我能够上传数据库到驱动器使用以下文章。

但如果不使用应用程序,我无法直接脱机访问它

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

我正在使用MODE_WRITE_仅从应用程序内将文件上载到驱动器

mfile.open(api, DriveFile.MODE_WRITE_ONLY, new DriveFile.DownloadProgressListener()      
And mime type as this String mimeType = MimeTypeMap.getSingleton().getExtensionFromMimeType("db");
当我从手机上的外部sd卡访问时,我的db大小是44kb,但当我在硬盘上看到时,它显示40kb。请建议如何使其可读,以便我可以在sqlite浏览器中直接打开它,因为当我打开它时会显示“文件未识别”


我是否必须更改db文件的只写部分或mime类型。请说明可能存在的问题

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

假设您的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;
}
upload(“temp.db”,dbFile,“application/x-sqlite3”)
com.google.android.gms.common.api.GoogleAppClient GAC;
///...
无效上载(最终字符串标题、最终文件文件、最终字符串mime){
如果(GAC!=null&&GAC.isConnected()&&titl!=null&&file!=null)尝试{
Drive.DriveApi.newDriveContents(GAC).setResultCallback(newResultCallback()){
@凌驾
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(
新的ResultCallback(){
@凌驾
public void onResult(@NonNull DriveFileResult fileRslt){
if(fileRslt.getStatus().issucess()){
//fileRslt.getDriveFile();答对了!!!
}
}
}
);
}
}
}
});
}catch(异常e){e.printStackTrace();}
}
静态布尔文件2(输出流操作系统,文件文件){
布尔值bOK=false;
InputStream=null;
如果(file!=null&&os!=null)尝试{
字节[]buf=新字节[4096];
is=新文件输入流(文件);
INTC;
而((c=is.read(buf,0,buf.length))>0)
os.write(buf,0,c);
bOK=真;
}catch(异常e){e.printStackTrace();}
最后{
试一试{
os.flush();os.close();
如果(is!=null)是.close();
}catch(异常e){e.printStackTrace();}
}
返回bOK;
}
在GooDrive的根目录中创建一个“temp.db”SQLite文件

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


我希望这就是你想要实现的。祝你好运,我得承认,我不知道你在问什么。但是,由于我已经成功地测试了一个上传到GooDrive的SQLite文件,我可以发布一段代码:

假设您的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;
}
upload(“temp.db”,dbFile,“application/x-sqlite3”)
com.google.android.gms.common.api.GoogleAppClient GAC;
///...
无效上载(最终字符串标题、最终文件文件、最终字符串mime){
如果(GAC!=null&&GAC.isConnected()&&titl!=null&&file!=null)尝试{
Drive.DriveApi.newDriveContents(GAC).setResultCallback(newResultCallback()){
@凌驾
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(
新的ResultCallback(){
@凌驾
public void onResult(@NonNull DriveFileResult fileRslt){
if(fileRslt.getStatus().issucess()){
//fileRslt.getDriveFile();答对了!!!
}
}
}
);
}
}
}
});
}catch(异常e){e.printStackTrace();}
}
静态布尔文件2(输出流操作系统,文件文件){
布尔值bOK=false;
InputStream=null;
如果(file!=null&&os!=null)尝试{
字节[]buf=新字节[4096];
is=新文件输入流(文件);
INTC;
而((c=is.read(buf,0,buf.length))>0)
os.write(buf,0,c);
bOK=真;
}catch(异常e){e.printStackTrace();}
最后{
试一试{
os.flush();os.close();
如果(is!=null)是.close();
}catch(异常e){e.printStackTrace();}
}
返回bOK;
}
在GooDrive的根目录中创建一个“temp.db”SQLite文件

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


我希望这就是你想要实现的。祝你好运

你的问题是当你从不同的客户端访问文件时,它们不一样吗?你的问题是当你从不同的客户端访问文件时,它们不一样吗?