我在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;
}
}
答案 0 :(得分:2)
如果连接没有打开SQLite数据库(在任何进程中),它只是一个普通文件,可以像任何其他普通文件一样被复制。 如果SQLite数据库 由连接保持打开但是没有正在进行的事务(特别是不是更新),那么你也应该没有问题支持它。
当事情变得可怕时,当事务处于打开状态时,这些事务正在执行更新。特别是,尽管备份发生在“随机时间”发生在文件写入上,但您将依赖于能够在未来使数据库处于一致状态。那是......不可取的。 最好连接,附加备份数据库文件,打开自己的事务,然后将事务中的数据复制到其他数据库。然后,一旦提交事务,就可以安全地复制备份数据库文件,因为您可以相当确定没有其他任何东西将打开它的连接。这样做的主要缺点是你在数据库上打开了一个相对较长的事务,但是SQLite没有像数据库服务器那样复杂的锁定模型,所以你会坚持这个;获得进程内DB的优势至少必须带来一些的缺点。