2

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;
    }
}
4

1 に答える 1

2

SQLite データベースが接続によって (どのプロセスでも) 開いたままにされていない場合、それは単なる通常のファイルであり、他の通常のファイルと同じようにコピーできます。SQLite データベース接続によって開いたままになっているが、進行中のトランザクション (特に更新ではない) がない場合、このようにバックアップしても問題はないはずです。

恐ろしいのは、トランザクションが更新を実行しているトランザクションを開いている場合です。特に、ファイルへの書き込みに関して「ランダムな時間に」バックアップが行われているにもかかわらず、将来的にデータベースを一貫した状態で取得できることに依存することになります。それは…お勧めできません。接続し、バックアップ DB ファイルを添付し、独自のトランザクションを開き、トランザクション内のデータを他の DB にコピーすることをお勧めします。次に、トランザクションをコミットしたら、バックアップ DB ファイルを安全にコピーできます。これは、他に何も接続が開かれていないことを十分に確信できるからです。これの主な欠点は、DB で比較的長いトランザクションを開いていることですが、SQLite は DB サーバーほど洗練されたロック モデルを持っていないため、それに固執しています。インプロセス DB の利点を得るには、結局のところ、少なくともいくつかの欠点が伴う必要があります。

于 2013-10-19T14:27:55.990 に答える