我是领域数据库的新手。我正面临着将领域数据库数据备份到谷歌驱动器中的问题。我阅读文档但我不知道如何逐步实现该功能。此外,我尝试了代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
realm.getDefaultInstance();
GlucosioApplication glucosioApplication = (GlucosioApplication) getApplicationContext();
realm = glucosioApplication.getDBHandler().getRealmIstance();
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle(getResources().getString(R.string.title_activity_backup_drive));
backup = glucosioApplication.getBackup();
backup.init(this);
connectClient();
mGoogleApiClient = backup.getClient();
backupButton = (Button) findViewById(R.id.activity_backup_drive_button_backup);
restoreButton = (Button) findViewById(R.id.activity_backup_drive_button_restore);
backupButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
openFolderPicker();
}
});
restoreButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
openFilePicker();
}
});
}
private void openFilePicker() {
// build an intent that we'll use to start the open file activity
IntentSender intentSender = Drive.DriveApi
.newOpenFileActivityBuilder()
// these mimetypes enable these folders/files types to be selected
.setMimeType(new String[]{DriveFolder.MIME_TYPE, "text/plain"})
.build(mGoogleApiClient);
try {
startIntentSenderForResult(
intentSender, REQUEST_CODE_SELECT, null, 0, 0, 0);
} catch (IntentSender.SendIntentException e) {
Log.e(TAG, "Unable to send intent", e);
showErrorDialog();
}
}
private void openFolderPicker() {
try {
if (mGoogleApiClient != null && mGoogleApiClient.isConnected()) {
if (intentPicker == null)
intentPicker = buildIntent();
//Start the picker to choose a folder
startIntentSenderForResult(
intentPicker, REQUEST_CODE_PICKER, null, 0, 0, 0);
}
} catch (IntentSender.SendIntentException e) {
Log.e(TAG, "Unable to send intent", e);
showErrorDialog();
}
}
private IntentSender buildIntent() {
return Drive.DriveApi
.newOpenFileActivityBuilder()
.setMimeType(new String[]{DriveFolder.MIME_TYPE})
.build(mGoogleApiClient);
}
private void downloadFromDrive(DriveFile file) {
file.open(mGoogleApiClient, DriveFile.MODE_READ_ONLY, null)
.setResultCallback(new ResultCallback<DriveApi.DriveContentsResult>() {
@Override
public void onResult(DriveApi.DriveContentsResult result) {
if (!result.getStatus().isSuccess()) {
showErrorDialog();
return;
}
// DriveContents object contains pointers
// to the actual byte stream
DriveContents contents = result.getDriveContents();
InputStream input = contents.getInputStream();
try {
File file = new File(realm.getPath());
OutputStream output = new FileOutputStream(file);
try {
try {
byte[] buffer = new byte[4 * 1024]; // or other buffer size
int read;
while ((read = input.read(buffer)) != -1) {
output.write(buffer, 0, read);
}
output.flush();
} finally {
output.close();
}
} catch (Exception e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Toast.makeText(getApplicationContext(),"Restart drive message", Toast.LENGTH_LONG).show();
// Reboot app
Intent mStartActivity = new Intent(getApplicationContext(), MainActivity.class);
int mPendingIntentId = 123456;
PendingIntent mPendingIntent = PendingIntent.getActivity(getApplicationContext(), mPendingIntentId, mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager mgr = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent);
System.exit(0);
}
});
}
private void uploadToDrive(DriveId mFolderDriveId) {
if (mFolderDriveId != null) {
//Create the file on GDrive
final DriveFolder folder = mFolderDriveId.asDriveFolder();
Drive.DriveApi.newDriveContents(mGoogleApiClient)
.setResultCallback(new ResultCallback<DriveApi.DriveContentsResult>() {
@Override
public void onResult(DriveApi.DriveContentsResult result) {
if (!result.getStatus().isSuccess()) {
Log.e(TAG, "Error while trying to create new file contents");
showErrorDialog();
return;
}
final DriveContents driveContents = result.getDriveContents();
// Perform I/O off the UI thread.
new Thread() {
@Override
public void run() {
// write content to DriveContents
OutputStream outputStream = driveContents.getOutputStream();
FileInputStream inputStream = null;
try {
inputStream = new FileInputStream(new File(realm.getPath()));
} catch (FileNotFoundException e) {
showErrorDialog();
e.printStackTrace();
}
byte[] buf = new byte[1024];
int bytesRead;
try {
if (inputStream != null) {
while ((bytesRead = inputStream.read(buf)) > 0) {
outputStream.write(buf, 0, bytesRead);
}
}
} catch (IOException e) {
showErrorDialog();
e.printStackTrace();
}
MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
.setTitle("glucosio.realm")
.setMimeType("text/plain")
.build();
// create a file in selected folder
folder.createFile(mGoogleApiClient, changeSet, driveContents)
.setResultCallback(new ResultCallback<DriveFolder.DriveFileResult>() {
@Override
public void onResult(DriveFolder.DriveFileResult result) {
if (!result.getStatus().isSuccess()) {
Log.d(TAG, "Error while trying to create the file");
showErrorDialog();
finish();
return;
}
showSuccessDialog();
finish();
}
});
}
}.start();
}
});
}
}
@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
switch (requestCode) {
case 1:
if (resultCode == RESULT_OK) {
backup.start();
}
break;
// REQUEST_CODE_PICKER
case 2:
intentPicker = null;
if (resultCode == RESULT_OK) {
//Get the folder drive id
DriveId mFolderDriveId = data.getParcelableExtra(
OpenFileActivityBuilder.EXTRA_RESPONSE_DRIVE_ID);
uploadToDrive(mFolderDriveId);
}
break;
// REQUEST_CODE_SELECT
case 3:
if (resultCode == RESULT_OK) {
// get the selected item's ID
DriveId driveId = data.getParcelableExtra(
OpenFileActivityBuilder.EXTRA_RESPONSE_DRIVE_ID);
DriveFile file = driveId.asDriveFile();
downloadFromDrive(file);
} else {
showErrorDialog();
}
finish();
break;
}
}
private void showSuccessDialog() {
Toast.makeText(getApplicationContext(), "Success", Toast.LENGTH_SHORT).show();
}
private void showErrorDialog() {
Toast.makeText(getApplicationContext(), "Error", Toast.LENGTH_SHORT).show();
}
public void connectClient() {
backup.start();
}
public void disconnectClient() {
backup.stop();
}
public boolean onOptionsItemSelected(MenuItem item) {
finish();
return true;
}
以上代码我不知道它是否有效。此外,GlucosioApplication中发生错误:glucosioApplication =(GlucosioApplication)getApplicationContext();我应该为GlucosioApplication导入什么库。请帮助我如何将数据备份到谷歌驱动器。
答案 0 :(得分:2)
获取领域文件:
Realm realm = Realm.getInstance(Application.config);
realm.close();
File f = new File(realm.getPath());
要保存该文件,请使用Google云端硬盘API保存文件
private void saveFiletoDrive(final File file, final GoogleApiClient mGoogleApiClient) {
// Start by creating a new contents, and setting a callback.
Drive.DriveApi.newDriveContents(mGoogleApiClient).setResultCallback(
new ResultCallback<DriveApi.DriveContentsResult>() {
@Override
public void onResult(DriveApi.DriveContentsResult result) {
// If the operation was not successful, we cannot do
// anything
// and must
// fail.
if (!result.getStatus().isSuccess()) {
Log.e("ERROR", "Failed to create new contents.");
return;
}
Log.e("SUCCESSFULL", "Connection successful, creating new contents...");
// Otherwise, we can write our data to the new contents.
// Get an output stream for the contents.
OutputStream outputStream = result.getDriveContents()
.getOutputStream();
FileInputStream fis;
try {
fis = new FileInputStream(file.getPath());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int n;
while (-1 != (n = fis.read(buf)))
baos.write(buf, 0, n);
byte[] photoBytes = baos.toByteArray();
outputStream.write(photoBytes);
outputStream.close();
outputStream = null;
fis.close();
fis = null;
} catch (FileNotFoundException e) {
Log.v("EXCEPTION", "FileNotFoundException: " + e.getMessage());
} catch (IOException e1) {
Log.v("EXCEPTION", "Unable to write file contents." + e1.getMessage());
}
String title = file.getName();
MetadataChangeSet metadataChangeSet = new MetadataChangeSet.Builder()
.setTitle(title).build();
/* if (mime.equals("application/vnd.google-apps.photo")) {*/
Log.v("CREATING", "Creating new file on Drive (" + title
+ ")");
Drive.DriveApi.getFolder(mGoogleApiClient,
Drive.DriveApi.getRootFolder(mGoogleApiClient).getDriveId()).createFile(mGoogleApiClient,
metadataChangeSet,
result.getDriveContents());
Toast.makeText(getApplicationContext(), "Backing up of Google Drive...", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(), "Back up Successfull!!", Toast.LENGTH_SHORT).show();
}
});
}
Google Api客户端
GoogleApiClient client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();