SQLite
 sql >> Base de Dados >  >> RDS >> SQLite

Melhores maneiras de criar backups para aplicativos offline?


Há muito pouca necessidade de fazer algo complexo, basta salvar o arquivo SQLiteDatabase.

Basicamente, feche o db da sala e salve o arquivo.

por exemplo. o seguinte é um exemplo muito rudimentar que salva no diretório de downloads em um subdiretório chamado 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
        );
    }
}

  • Observe os métodos onCreate e verifiqueStoragePermissions incluídos apenas para obter a permissão para gravar no armazenamento externo (observe as permissões do usuário também definidas no manifesto).
    • O importante é fazer isso fora do Room (da mesma forma, se você restaurar a partir de um backup).

Depois de correr :-



E depois copiando o arquivo para um PC e abrindo com o SQLite Manager:-



Isso sendo totalmente como esperado e como mostrado altamente portátil, ou seja, você pode soltá-lo em qualquer ferramenta SQLite (a versão SQLite usada por tal ferramenta pode ser um fator restritivo)