gpt4 book ai didi

android - 备份/恢复 SQLite 数据库到 Google Drive 应用程序文件夹

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:18:25 25 4
gpt4 key购买 nike

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

我面临的问题是,我不确定如何将数据库文件 (.db) 从设备“发送”到 google drive app 文件夹。 Google 共享了用于创建新文件的代码段,仅此而已。我确实找到了一个与我正在寻找的内容模糊相似的先前提出的问题 Google drive to back up and restore database and shared preferences of Android application但话又说回来,这不是我要找的。

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

更新 1:

共享 onConnected() 代码,

    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 app 文件夹。对于那些可能遇到类似问题的人,请尝试将数据库路径更改为 "/data/data/com.abc.efg/databases/"+ db_name 而不是 "/data/com.abc。 efg/数据库/"+ db_name

下一步是能够从 google drive app 文件夹中检索和恢复数据库。如果我能够让它工作,应该更新这个问题。

最佳答案

假设您有一个指向您的 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(); }
}

祝你好运

关于android - 备份/恢复 SQLite 数据库到 Google Drive 应用程序文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33602812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com