我想在sdcard上备份我的应用程序数据库,然后再导入它。 .sqlite数据库由ORMLite管理。我已经阅读了答案https://stackoverflow.com/a/20143148/335105,但是按照这种方法将删除导出后生成的当前数据库中的所有数据。

有没有一种方法可以将我的数据库导出到sdcard,然后再导入它而不会丢失已经包含的数据?有什么建议吗?

最佳答案

如果您知道以后不会更改数据模型,则可以仅创建数据库的“哑”导出。 DB作为文件存储在

public static final String CURRENT_DATABASE_PATH = "data/data/" + App.getContext().getPackageName() + "/databases/" + DatabaseHelper.DATABASE_NAME


其中DATABASE_NAME是创建数据库时使用的名称。

这是我使用的方法(我不是作者,此代码受到其他一些我现在找不到的stackoverflow线程的强烈启发)
出口:

public static void exportDB() {
    try {
        File dbFile = new File(CURRENT_DATABASE_PATH);
        FileInputStream fis = new FileInputStream(dbFile);
        getExportDirectory();
        String outFileName = createExportName();
        OutputStream output = new FileOutputStream(outFileName);
        byte[] buffer = new byte[1024];
        int length;
        while ((length = fis.read(buffer)) > 0) {
            output.write(buffer, 0, length);
        }
        output.flush();
        output.close();
        fis.close();
    } catch (Exception e) {
        App.log(e);
    }
}


再次输入

public static boolean importDB(String dbPath) {
        try {
            AppStorage.get().close();
            File newDb = new File(dbPath);
            File oldDb = new File(CURRENT_DATABASE_PATH);
            if (newDb.exists()) {
                copyFile(new FileInputStream(newDb), new FileOutputStream(oldDb));
                AppStorage.get().getWritableDatabase().close();
            }
            AppStorage.reset();
            return true;
        } catch (Exception e) {
            App.log(e);
        }
        return false;
    }


但是,如果您打算更新数据模型,则此方法将行不通,因此您可能需要手动导出/导入所需的所有内容。

编辑:AppStorage是我的自定义数据库包装器。这种方法不会删除您的数据库。

关于android - 备份/还原由ORMLite管理的Android App DB,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21157070/

10-09 05:47
查看更多