我想在sdcard
上备份我的应用程序数据库,然后再导入它。 .sqlite
数据库由ORMLite管理。我已经阅读了答案https://stackoverflow.com/a/20143148/335105,但是按照该方法将删除导出后生成的当前数据库中的所有数据。
有没有办法可以将我的数据库导出到SD卡,然后导入它而不会丢失已经包含的数据?建议?
答案 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是我的自定义数据库包装器。此方法不会删除您的数据库。