备份/恢复由ORMLite管理的Android App DB

时间:2014-01-16 08:48:17

标签: android ormlite

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

有没有办法可以将我的数据库导出到SD卡,然后导入它而不会丢失已经包含的数据?建议?

1 个答案:

答案 0 :(得分:1)

如果您知道以后不会更改您的数据模型,则可以创建数据库的“哑”导出。 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是我的自定义数据库包装器。此方法不会删除您的数据库。