sql >> Base de Datos >  >> RDS >> SQLite

¿Las mejores formas de crear copias de seguridad para aplicaciones fuera de línea?

Hay muy poca necesidad de hacer algo complejo, simplemente guarde el archivo SQLiteDatabase.

Básicamente cierre Room db y luego guarde el archivo.

p.ej. el siguiente es un ejemplo muy rudimentario que se guarda en el directorio de descargas en un subdirectorio llamado DBsaves:-

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    resetSequenceAction();
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        verifyStoragePermissions(this);
    }
}

@Override
protected void onStart() {
    super.onStart();
    mTestDB = Room.databaseBuilder(this,TestDatabase.class,TestDatabase.DBNAME).build();
    addSomeData();
    addSomeData();
    addSomeData();
    addSomeData();
    mTestDB.close();
    File dbfile = this.getDatabasePath(TestDatabase.DBNAME);
    File sdir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),"DBsaves");
    String sfpath = sdir.getPath() + File.separator + "DBsave" + String.valueOf(System.currentTimeMillis());
    if (!sdir.exists()) {
        sdir.mkdirs();
    }
    File savefile = new File(sfpath);
    try {
        savefile.createNewFile();
        int buffersize = 8 * 1024;
        byte[] buffer = new byte[buffersize];
        int bytes_read = buffersize;
        OutputStream savedb = new FileOutputStream(sfpath);
        InputStream indb = new FileInputStream(dbfile);
        while ((bytes_read = indb.read(buffer,0,buffersize)) > 0) {
            savedb.write(buffer,0,bytes_read);
        }
        savedb.flush();
        indb.close();
        savedb.close();

    } catch (Exception e) {
        e.printStackTrace();
    }
}


public void verifyStoragePermissions(Activity activity) {

    final int REQUEST_EXTERNAL_STORAGE = 1;
    String[] PERMISSIONS_STORAGE = {

            //Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
    };

    int permission = ActivityCompat.checkSelfPermission(
            activity,
            Manifest.permission.WRITE_EXTERNAL_STORAGE);

    if(permission != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(
                activity,
                PERMISSIONS_STORAGE,
                REQUEST_EXTERNAL_STORAGE
        );
    }
}
  • Tenga en cuenta que los métodos onCreate ycheckStoragePermissions solo se incluyen para obtener el permiso para escribir en el almacenamiento externo (tenga en cuenta que los permisos de usuario también se establecen en el manifiesto).

    • Lo importante es hacer esto fuera de Room (igual que si tuviera que restaurar desde una copia de seguridad).

Después de ejecutar :-

Y luego copiar el archivo a una PC y abrirlo con SQLite Manager :-

Esto es completamente como se esperaba y como se muestra altamente portátil, es decir, puede colocarlo en cualquier herramienta SQLite (la versión de SQLite utilizada por dicha herramienta puede ser un factor restrictivo)