我在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;
    }
}发布于 2013-10-19 14:27:55
如果SQLite数据库不被连接打开(在任何进程中),那么它只是一个普通文件,可以像任何其他普通文件一样被复制。如果SQLite数据库是由连接打开的,但是没有事务正在进行(特别是没有更新),那么您也应该不会遇到像这样备份它的问题。
事情变得可怕的地方是当事务打开时,这些事务正在执行更新。特别是,您将依赖于能够在将来使DB处于一致状态,尽管“在一个随机时间”发生对文件的写入的备份。那是…不明智。最好是连接、附加备份DB文件、打开自己的事务,然后将事务中的数据复制到另一个DB。然后,一旦您提交了事务,就可以安全地复制备份DB文件,因为您可以相当肯定它上不会有任何连接打开。这样做的主要缺点是,您将在DB上打开一个相对较长的事务,但是SQLite没有DB服务器那样复杂的锁定模型,因此您只能坚持这样做;毕竟,要获得进程内DB的优势必须至少有一些缺点。
https://stackoverflow.com/questions/19464988
复制相似问题