gpt4 book ai didi

android - 将备份同步到android中的谷歌驱动器

转载 作者:行者123 更新时间:2023-11-29 00:25:56 25 4
gpt4 key购买 nike

我在 Android 中创建了 SQLite 数据库的备份,并希望将其同步到 Google 云端硬盘。备份不同步,从以下代码看没有报错:

public class Synchorize extends Activity {
static final int REQUEST_ACCOUNT_PICKER = 1;
static final int REQUEST_AUTHORIZATION = 2;
private static Drive service;
private static Uri fileUri;

private GoogleAccountCredential credential;

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.synchronize);
credential = GoogleAccountCredential.usingOAuth2(this,
Arrays.asList(DriveScopes.DRIVE));
startActivityForResult(credential.newChooseAccountIntent(),
REQUEST_ACCOUNT_PICKER);

}

@Override
protected void onActivityResult(final int requestCode,
final int resultCode, final Intent data) {
switch (requestCode) {
case REQUEST_ACCOUNT_PICKER:
if (resultCode == RESULT_OK && data != null
&& data.getExtras() != null) {
String accountName = data
.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
if (accountName != null) {
credential.setSelectedAccountName(accountName);
service = getDriveService(credential);
saveFileToDrive();

}
}
break;
}

}

private Drive getDriveService(GoogleAccountCredential credential) {
return new Drive.Builder(AndroidHttp.newCompatibleTransport(),
new GsonFactory(), credential).build();
}

private void saveFileToDrive() {
Thread t = new Thread(new Runnable() {
@Override
public void run() {

try {
// File's binary content
fileUri = Uri
.fromFile(new java.io.File(
Environment.getDataDirectory().getPath()
+ "/data/com.example.note_taking/databases/notes.db"));
java.io.File fileContent = new java.io.File(fileUri.getPath());


FileContent mediaContent = new FileContent(getMimeType("db"), fileContent);

// File's metadata.
com.google.api.services.drive.model.File body = new com.google.api.services.drive.model.File();
body.setTitle(fileContent.getName());
body.setMimeType(getMimeType("db"));

com.google.api.services.drive.model.File file = service
.files().insert(body, mediaContent).execute();
if (file != null) {
Toast.makeText(getApplicationContext(),
"Backup Uploaded Successfully",
Toast.LENGTH_LONG).show();
finish();

}
} catch (UserRecoverableAuthIOException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

}
});
t.start();
}

public String getMimeType(String url) {
String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
url);
return mimeType;
}
}

最佳答案

如果 SQLite 数据库没有被连接打开(在任何进程中),它只是一个普通文件,可以像任何其他普通文件一样被复制。如果 SQLite 数据库通过连接保持打开状态但没有正在进行的事务(尤其是没有更新),那么像这样备份它应该也没有问题。

事情变得可怕的地方是当您打开事务时,这些事务正在执行更新。特别是,您将依赖于将来能够使数据库处于一致状态,尽管就文件写入而言,备份是“随机时间”发生的。那是……不可取的。 最好先连接,附加备份数据库文件,打开自己的事务,然后将事务中的数据复制到另一个数据库。然后,一旦提交事务,就可以安全地复制备份数据库文件,因为您可以相当确定没有其他任何东西会在其上打开连接。这样做的主要缺点是您将在数据库上打开一个相对较长的事务,但 SQLite 没有像数据库服务器那样复杂的锁定模型,因此您只能使用它;毕竟,获得进程内数据库的优势至少会带来一些劣势。

关于android - 将备份同步到android中的谷歌驱动器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19464988/

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