Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将备份同步到android中的google drive_Android_Sqlite_Google Drive Api - Fatal编程技术网

将备份同步到android中的google drive

将备份同步到android中的google drive,android,sqlite,google-drive-api,Android,Sqlite,Google Drive Api,我在Android中创建了一个SQLite数据库的备份,并希望将其与Google Drive同步。备份未同步,并且以下代码没有错误: 公共类同步扩展活动{ 静态最终整数请求\帐户\选择器=1; 静态最终int请求_授权=2; 专用静态驱动器服务; 私有静态urifileuri; 私人GoogleAccountCredential凭证; @凌驾 创建时受保护的void(Bundle savedInstanceState){ //TODO自动生成的方法存根 super.onCreate(savedI

我在Android中创建了一个SQLite数据库的备份,并希望将其与Google Drive同步。备份未同步,并且以下代码没有错误:

公共类同步扩展活动{
静态最终整数请求\帐户\选择器=1;
静态最终int请求_授权=2;
专用静态驱动器服务;
私有静态urifileuri;
私人GoogleAccountCredential凭证;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
setContentView(R.layout.synchronize);
凭证=GoogleAccountCredential.UsingAuth2(此,
asList(DriveScopes.DRIVE));
startActivityForResult(credential.newChooseAccountContent(),
请求(账户选取者);
}
@凌驾
受保护的无效onActivityResult(最终整数请求代码,
最终int结果代码,最终意图数据){
开关(请求代码){
案例请求\账户\选取者:
如果(resultCode==RESULT\u OK&&data!=null
&&data.getExtras()!=null){
字符串accountName=数据
.getStringExtra(AccountManager.KEY\u账户名称);
if(accountName!=null){
凭证.setSelectedAccountName(accountName);
服务=getDriveService(凭证);
saveFileToDrive();
}
}
打破
}
}
专用驱动器getDriveService(GoogleAccountCredential凭据){
返回新的Drive.Builder(AndroidHttp.newCompatibleTransport(),
新建GsonFactory(),凭证).build();
}
私有void saveFileToDrive(){
线程t=新线程(新的可运行线程(){
@凌驾
公开募捐{
试一试{
//文件的二进制内容
fileUri=Uri
.fromFile(新的java.io.File(
Environment.getDataDirectory().getPath()
+“/data/com.example.note_taking/databases/notes.db”);
java.io.File fileContent=新的java.io.File(fileUri.getPath());
FileContent mediaContent=新的FileContent(getMimeType(“db”),FileContent;
//文件的元数据。
com.google.api.services.drive.model.File body=new com.google.api.services.drive.model.File();
setTitle(fileContent.getName());
body.setMimeType(getMimeType(“db”);
com.google.api.services.drive.model.File文件=服务
.files().insert(body,mediaContent).execute();
如果(文件!=null){
Toast.makeText(getApplicationContext(),
“备份已成功上载”,
Toast.LENGTH_LONG).show();
完成();
}
}捕获(UserRecoverableAuthIOE异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
}
});
t、 start();
}
公共字符串getMimeType(字符串url){
字符串mimeType=MimeTypeMap.getSingleton().getMimeTypeFromExtension(
网址);
返回mimeType;
}
}

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


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

用Google Drive的备份恢复当前的sqlite数据库怎么样,我该怎么做?在执行任何备份和恢复之前,如何确保没有打开的连接和事务?