慕桂英4014372
在您的活动中制作备份和恢复按钮并定义本地数据库变量,例如,private MainDatabase localBackup = new MainDatabase(this);然后点击即可进行备份和恢复操作@Overridepublic void onClick(View v) { final MainDatabase db = new MainDatabase(getApplicationContext()); switch (v.getId()) { case R.id.tvBackUp: String outFileName = Environment.getExternalStorageDirectory() + File.separator + getResources().getString(R.string.app_name) + File.separator; localBackup.performBackup(db, outFileName); break; case R.id.tvRestore: File folder = new File(Environment.getExternalStorageDirectory() + File.separator + getApplicationContext().getResources().getString(R.string.app_name)); if (folder.exists()) { final File[] files = folder.listFiles(); if (files.length == 0) { Toast.makeText(this, "No any Backup", Toast.LENGTH_SHORT).show(); } else { localBackup.performRestore(db); } } break; }}在数据库文件中制定备份方法public void performBackup(final MainDatabase db, final String outFileName) { File folder = new File(Environment.getExternalStorageDirectory() + File.separator + mContext.getResources().getString(R.string.app_name)); boolean success = true; if (!folder.exists()) success = folder.mkdirs(); if (success) { final Dialog dialog = new Dialog(mContext); dialog.setContentView(R.layout.backup_dialog); dialog.getWindow().getAttributes().windowAnimations = R.style.PauseDialogAnimation;dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent); dialog.show(); Button btnSave = dialog.findViewById(R.id.btnSave); Button btnCancel = dialog.findViewById(R.id.btnCancel); EditText etName = dialog.findViewById(R.id.etName); etName.setInputType(InputType.TYPE_CLASS_TEXT); btnSave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String m_Text = etName.getText().toString(); String out = outFileName + m_Text + ".db"; db.backup(out); dialog.dismiss(); } }); btnCancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); } }); } else Toast.makeText(mContext, "Unable to create directory. Retry", Toast.LENGTH_SHORT).show();} public void backup(String outFileName) { //database path final String inFileName = mContext.getDatabasePath(DATABASE_NAME).toString(); try { File dbFile = new File(inFileName); FileInputStream fis = new FileInputStream(dbFile); // Open the empty db as the output stream OutputStream output = new FileOutputStream(outFileName); // Transfer bytes from the input file to the output file byte[] buffer = new byte[1024]; int length; while ((length = fis.read(buffer)) > 0) { output.write(buffer, 0, length); } // Close the streams output.flush(); output.close(); fis.close(); Toast.makeText(mContext, "Backup Completed", Toast.LENGTH_SHORT).show(); } catch (Exception e) { Toast.makeText(mContext, "Unable to backup database. Retry", Toast.LENGTH_SHORT).show(); e.printStackTrace(); }}以及进行恢复时,询问用户要恢复什么备份public void performRestore(final MainDatabase db) { File folder = new File(Environment.getExternalStorageDirectory() + File.separator + mContext.getResources().getString(R.string.app_name)); if (folder.exists()) { final File[] files = folder.listFiles(); final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(mContext, android.R.layout.select_dialog_item); for (File file : files) arrayAdapter.add(file.getName()); AlertDialog.Builder builderSingle = new AlertDialog.Builder(mContext); builderSingle.setTitle("Select & Restore "); builderSingle.setNegativeButton("cancle", (dialog, which) -> dialog.dismiss()); builderSingle.setAdapter(arrayAdapter, (dialog, which) -> { try { db.importDB(files[which].getPath()); } catch (Exception e) { Toast.makeText(mContext, "Unable to restore. Retry", Toast.LENGTH_SHORT).show(); } }); builderSingle.show(); } else Toast.makeText(mContext, "Backup folder not present.\nDo a backup before a restore!", Toast.LENGTH_SHORT).show();} public void importDB(String inFileName) { final String outFileName = mContext.getDatabasePath(DATABASE_NAME).toString(); try { File dbFile = new File(inFileName); FileInputStream fis = new FileInputStream(dbFile); // Open the empty db as the output stream OutputStream output = new FileOutputStream(outFileName); // Transfer bytes from the input file to the output file byte[] buffer = new byte[1024]; int length; while ((length = fis.read(buffer)) > 0) { output.write(buffer, 0, length); } // Close the streams output.flush(); output.close(); fis.close(); Toast.makeText(mContext, "Restore Completed", Toast.LENGTH_SHORT).show(); } catch (Exception e) { Toast.makeText(mContext, "Unable to import database. Retry", Toast.LENGTH_SHORT).show(); e.printStackTrace(); }}