如何在 Google Drive Android 中备份房间数据库?

M.Y*_*ran 5 android google-drive-android-api android-room

这可能是一个愚蠢的问题,但我找不到任何解决方案。我需要知道如何备份 roomdatabase 并使用 Google Drive 检索它。那么房间数据库的mime类型是什么?谁能知道如何做到这一点?让我发布我迄今为止尝试过的内容:

 private void saveFileToDrive(File file) {

        mDriveClient = Drive.getDriveClient(this, GoogleSignIn.getLastSignedInAccount(this));
        // Build a drive resource client.
        mDriveResourceClient =
                Drive.getDriveResourceClient(this, GoogleSignIn.getLastSignedInAccount(this));

        final Task<DriveFolder> rootFolderTask =mDriveResourceClient.getRootFolder();
        final Task<DriveContents> createContentsTask =mDriveResourceClient.createContents();
        Tasks.whenAll(rootFolderTask, createContentsTask)
                .continueWithTask(new Continuation<Void, Task<DriveFile>>() {
                    @Override
                    public Task<DriveFile> then(@NonNull Task<Void> task) throws Exception {
                        DriveFolder parent = rootFolderTask.getResult();
                        DriveContents contents = createContentsTask.getResult();
//                        OutputStream outputStream = contents.getOutputStream();
//                        try (Writer writer = new OutputStreamWriter(outputStream)) {
//                            writer.write("Hello World!");
//                        }
                        OutputStream oos = contents.getOutputStream();
                        if (oos != null) try {
                            InputStream is = new FileInputStream(file);
                            byte[] buf = new byte[4096];
                            int c;
                            while ((c = is.read(buf, 0, buf.length)) > 0) {
                                oos.write(buf, 0, c);
                                oos.flush();
                            }
                        }
                        finally { oos.close();}

                        MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
                                .setTitle("mm.db")
                                .setMimeType("application/x-sqlite3")
                                .setStarred(true)
                                .build();

                        return mDriveResourceClient.createFile(parent, changeSet, contents);
                    }
                })
                .addOnSuccessListener(this,
                        new OnSuccessListener<DriveFile>() {
                            @Override
                            public void onSuccess(DriveFile driveFile) {
//                                showMessage(getString(R.string.file_created,
//                                        driveFile.getDriveId().encodeToString()));
                                finish();
                            }
                        })
                .addOnFailureListener(this, new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.e(TAG, "Unable to create file", e);
         //               showMessage(getString(R.string.file_create_error));
                        finish();
                    }
                });
    }
Run Code Online (Sandbox Code Playgroud)

如何经常备份但使用房间数据库android?提前致谢。

abi*_*ita 0

你可以参考这个帖子。可能存在可靠性问题,因为 Google 云端硬盘是独立于您自己的应用程序的应用程序。仅当您的应用未主动使用数据库时,驱动器才应使用该文件。我不知道 Drive 是否正在采取任何措施来确保这一点。否则,您可能会损坏数据。如果用户在 Drive 完成任何同步工作之前修改多个设备上的数据(例如,其中一台设备当前处于离线状态),您也会遇到数据损坏。它还指出SQLite需要直接文件系统访问数据库。房间并没有改变这一点。