Página Principal

lunes, 25 de abril de 2016

Backup de una BD(SQLite) en Android

Aquí mostrare un ejemplo de como generar o restaurar un Backup de una Base de Dato en android.

En principio hay que aclarar algunas cuestiones. Una vez creada la base de datos, tenemos que saber donde se aloja la misma...

/data/data/com.example.app/databases/example.db

Para un ejemplo generico, la BD asi se guardara en nuestra memoria interna.

public class GestionBackup {

    private Context contexto;

    public static final String PACKAGE_NAME = "app.com.kiosquin_v43";
    public static final String DATABASE_NAME = DBhelper.DB_NAME;
    public static final String APP_PATH = "/Kiosquin-v4.3/backup/";

    public static final String RUTA_BACKUP = Environment.getExternalStorageDirectory().
            getAbsolutePath() + APP_PATH;

    /** Contains: /data/data/com.example.app/databases/example.db **/
    private static final String DIR_DB_INTERNA =
                    "/data/" + PACKAGE_NAME +
                    "/databases/" + DATABASE_NAME;

    private static final String DIR_DB_BACKUP =
                    APP_PATH + "myDB.db";

    public GestionBackup(Context c){
        File file = new File(RUTA_BACKUP);
        //creo el directorio donde ira puesto el backup (Sin esto no lo puede generar)
        file.mkdirs();
        contexto=c;
    }

    public void importDB() {
        try {
            File sd = Environment.getExternalStorageDirectory();
            File data = Environment.getDataDirectory();
            if (sd.canWrite()) {

                File backupDB = new File(data, DIR_DB_INTERNA);
                File currentDB = new File(sd, DIR_DB_BACKUP);

                FileChannel src = new FileInputStream(currentDB).getChannel();
                FileChannel dst = new FileOutputStream(backupDB).getChannel();
                dst.transferFrom(src, 0, src.size());
                src.close();
                dst.close();
                Mensaje.ver("Import Exitoso!",contexto);

            }
        } catch (Exception e) {

            Mensaje.ver("Import Erroneo!", contexto);

        }
    }

    public void exportDB() {
        try {
            File sd = Environment.getExternalStorageDirectory();
            File data = Environment.getDataDirectory();

            if (sd.canWrite()) {

                File currentDB = new File(data, DIR_DB_INTERNA);
                File backupDB = new File(sd, DIR_DB_BACKUP);

                FileChannel src = new FileInputStream(currentDB).getChannel();
                FileChannel dst = new FileOutputStream(backupDB).getChannel();
                dst.transferFrom(src, 0, src.size());
                src.close();
                dst.close();
                Mensaje.ver( "Backup Exitoso!",contexto);

            }
        } catch (Exception e) {

            Mensaje.ver("Backup Erroneo!", contexto);

        }
    }
}

La clase Mensaje para los que les interese, ahí estará mas detallada.

Creo que el ejemplo esta bastante claro de seguir,

* PACKAGE_NAME:
                                  Nombre o dirección del paquete de nuestra app;
* DATABASE_NAME:
                                  Nombre de nuestra Base de Dato;          

* APP_PATH:
                     Direccion donde se alojara nuestra Backup

* RUTA_BACKUP:
     //Se obtiene la direccion completa, No la utilizo. porque al crear el file uso otro constructor
     Environment.getExternalStorageDirectory(). getAbsolutePath() + APP_PATH

* DIR_DB_INTERNA = 
                                 "/data/" + PACKAGE_NAME + "/databases/" + DATABASE_NAME;

* DIR_DB_BACKUP = 
                                 APP_PATH + "myDB.db";

Por ultimo aclarar que lo que hacen estas funciones son copiar y pegar el archivo de la base de dato en el destino que elegimos con el nombre que nosotros definimos al archivo.
Hay otras formas de hacer el backup "Mas Segura" pero esta me parece la mas sencilla y anda bien

Un saludo

1 comentario:

  1. SEGA GENESIS - GAN-GAMING
    SEGA GENESIS. https://sol.edu.kg/ GENESIS-HANDS. Genesis (JP-EU). NA. goyangfc.com NA. 스포츠 토토 사이트 NA. SEGA herzamanindir.com/ GENESIS-HANDS. NA. SEGA GENESIS. NA. wooricasinos.info GENESIS-HANDS. NA.

    ResponderEliminar