在Android中将备份同步到谷歌驱动器

时间:2013-10-19 10:25:08

标签: android sqlite google-drive-api

我在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;
    }
}

1 个答案:

答案 0 :(得分:2)

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

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