sql >> Databasteknik >  >> RDS >> SQLite

Rummets bästa sätt att skapa säkerhetskopior för offlineapplikationer?

Det finns väldigt lite behov av att göra något komplicerat, utan spara helt enkelt SQLiteDatabase-filen.

Stäng i princip Room db och spara sedan filen.

t.ex. följande är ett mycket rudimentärt exempel som sparar till nedladdningskatalogen i en underkatalog som heter 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
        );
    }
}
  • Notera att onCreate och verifyStoragePermissions-metoderna endast ingår för att få behörighet att skriva till extern lagring (observera att användarbehörigheter också anges i manifestet).

    • Det viktiga är att göra detta utanför rummet (likaså om du skulle återställa från en säkerhetskopia).

Efter att ha kört :-

Och sedan kopiera filen till en PC och öppna med SQLite Manager :-

Detta är helt som förväntat och som visat mycket portabelt, dvs du kan släppa det i vilket SQLite-verktyg som helst (SQLite-version som används av ett sådant verktyg kan vara en begränsande faktor)




  1. Hur LTRIM()-funktionen fungerar i MySQL

  2. Hur man dockar/avdockar frågefönster och andra flikar i SQL Server Management Studio (SSMS) - SQL Server/TSQL självstudie del 21

  3. GROUP BY / aggregerad funktionsförvirring i SQL

  4. Hur man lägger till primär nyckelbegränsning till identitetskolumner i alla tabeller i SQL Server Database - SQL Server / TSQL självstudie del 63