Android数据库备份

时间:2014-12-17 10:58:44

标签: android android-sqlite

几个月前,我制作了一款Android应用。但在那个时候,我并不认为我需要备份我的数据库。事实是,现在我做了,但我没有实现它。

现在,无论如何我都可以进行数据库备份而不会丢失数据吗?因为我认为如果我为我的数据库备份制作方法,当我构建应用程序时,我会丢失所有数据,因为我有这个方法:

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + POINTS_TABLE);
    db.execSQL("DROP TABLE IF EXISTS " + NETWORKS_TABLE);
    onCreate(db);
}

2 个答案:

答案 0 :(得分:1)

将db文件复制到sdcard是一种备份方式

public static void copyFileInSDCard () {

    try {
        File sd = Environment.getExternalStorageDirectory ();
        File data = Environment.getDataDirectory ();

        if (sd.canWrite ()) {
            String DATABASE_NAME = "YOURDBNAME";
            String currentDBPath = "//data//your.package//databases//" + DATABASE_NAME;
            String backupDBPath = "FILE[Name]";
            File currentDB = new File (data, currentDBPath);
            File backupDB = new File (sd, backupDBPath);

            if (currentDB.exists ()) {
                @SuppressWarnings("resource")
                FileChannel src = new FileInputStream (currentDB).getChannel ();
                @SuppressWarnings("resource")
                FileChannel dst = new FileOutputStream (backupDB).getChannel ();
                dst.transferFrom (src, 0, src.size ());
                src.close ();
                dst.close ();
            }
        }
    }
    catch (Exception e) {
        e.printStackTrace ();
    }
}

答案 1 :(得分:0)

@yuvaツ提供的解决方案

如果您的设备运行的是Android v4或更高版本,则可以使用adb backup命令在不使用root的情况下提取应用数据(包括数据库),然后提取备份文件并访问sqlite数据库。

首先使用以下命令通过USB电缆将应用数据备份到PC,将app.package.name替换为应用程序的实际包名称。

adb backup -f~ / data.ab -noapk app.package.name 这将提示您“解锁设备并确认备份操作”。请勿为备份加密提供密码,以便稍后解压缩。单击设备上的“备份我的数据”按钮。屏幕将显示您要备份的软件包的名称,然后在成功完成后自行关闭。

主文件夹中生成的data.ab文件包含android备份格式的应用程序数据。要提取它,请使用以下命令:

dd if = data.ab bs = 1 skip = 24 | openssl zlib -d | tar -xvf - 结果是包含应用程序数据的apps / app.package.name /文件夹,包括sqlite数据库。

有关详细信息,请查看original blog post