Copia de seguridad y restauración de la base de datos SQLite a sdcard

¿Cómo puedo hacer una copia de seguridad de mi base de datos en la tarjeta SD automáticamente en mi aplicación? Y luego, ¿cómo lo restauro?

Aquí está mi código:

// Local database InputStream input = new FileInputStream(from); // create directory for backup File dir = new File(DB_BACKUP_PATH); dir.mkdir(); // Path to the external backup OutputStream output = new FileOutputStream(to); // transfer bytes from the Input File to the Output File byte[] buffer = new byte[1024]; int length; while ((length = input.read(buffer))>0) { output.write(buffer, 0, length); } output.flush(); output.close(); input.close(); 

¿Cómo puedo hacer una copia de seguridad de mi base de datos en la tarjeta SD automáticamente en mi aplicación?

Cópielo usando la E / S Java estándar. SQLiteDatabase embargo, asegúrese de no tener ningún objeto SQLiteDatabase abierto.

Y luego ¿cómo lo restauro?

Cópielo usando la E / S Java estándar. Sin embargo, asegúrese de no tener ningún objeto abierto SQLiteDatabase en la base de datos anterior.

Puede usar getPath() en un objeto SQLiteDatabase para averiguar dónde reside, AFAIK (no lo ha intentado).

Gracias a las respuestas existentes. Aquí está la clase completa (con uso de “getDatabasePath”):

 package com.levionsoftware.bills.data.db; import android.content.Context; import android.os.Environment; import android.widget.Toast; import com.levionsoftware.bills.MyApplication; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.nio.channels.FileChannel; /** * Created by denny on 16/05/2016. * Source: http://stackoverflow.com/questions/18322401/is-it-posible-backup-and-restre-a-database-file-in-android-non-root-devices */ public class BackupAndRestore { public static void importDB(Context context) { try { File sd = Environment.getExternalStorageDirectory(); if (sd.canWrite()) { File backupDB = context.getDatabasePath(DBHandler.getDBName()); String backupDBPath = String.format("%s.bak", DBHandler.getDBName()); File currentDB = new File(sd, backupDBPath); FileChannel src = new FileInputStream(currentDB).getChannel(); FileChannel dst = new FileOutputStream(backupDB).getChannel(); dst.transferFrom(src, 0, src.size()); src.close(); dst.close(); MyApplication.toastSomething(context, "Import Successful!"); } } catch (Exception e) { e.printStackTrace(); } } public static void exportDB(Context context) { try { File sd = Environment.getExternalStorageDirectory(); File data = Environment.getDataDirectory(); if (sd.canWrite()) { String backupDBPath = String.format("%s.bak", DBHandler.getDBName()); File currentDB = context.getDatabasePath(DBHandler.getDBName()); File backupDB = new File(sd, backupDBPath); FileChannel src = new FileInputStream(currentDB).getChannel(); FileChannel dst = new FileOutputStream(backupDB).getChannel(); dst.transferFrom(src, 0, src.size()); src.close(); dst.close(); MyApplication.toastSomething(context, "Backup Successful!"); } } catch (Exception e) { e.printStackTrace(); } } } 

https://stackoverflow.com/a/18322762/293280

La respuesta anterior en una pregunta duplicada proporciona un excelente ejemplo de importación y exportación de sus DB SQLite a la tarjeta SD. Echar un vistazo.