为脱机应用程序创建备份的最佳方法?

时间:2018-06-18 19:36:06

标签: android performance sqlite android-sqlite android-room

所以我说让非常复杂的数据库使用many to many数据库设计foreign keys并连接表和它的Room数据库。我想为它创建备份系统,因为它的离线应用程序我需要导出数据库并将其存储到谷歌驱动器的应用程序文件夹中。我在最近一天阅读了很多关于它的内容,但仍然有点困惑我看到有办法将数据库导出为 CSV JSON excel 文件或仅作为.db文件,但这样做的最佳做法是什么以及专业人员如何处理它?<​​/ p>

1 个答案:

答案 0 :(得分:2)

几乎没有必要做任何复杂的事情,而只需保存SQLiteDatabase文件。

基本上关闭Room db然后保存文件。

e.g。以下是一个非常基本的示例,它保存到名为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
        );
    }
}
  • 请注意,仅包含onCreate和verifyStoragePermissions方法以获取写入外部存储的权限(注意还在清单中设置用户权限)。

    • 导入的东西是在Room之外执行此操作(同样,如果您要从备份中恢复)。

跑完后: -

enter image description here

然后将文件复制到PC并使用SQLite Manager打开: -

enter image description here

这完全符合预期,并且显示高度可移植,即您可以将其放入任何SQLite工具(此类工具使用的SQLite版本可能是一个限制因素)