Android备份和还原SD卡的数据库

时间:2011-09-11 15:20:57

标签: android sqlite android-sdcard

我目前正在寻找在我的Android应用程序中构建备份功能。然而,在开始实施它之前,我有点挣扎,因为我不确定正确的方法是什么。

我在网上发现了一些有趣的文章,所以我提出了三种可能的解决方案:

  1. 将整个DB文件备份到SD卡
  2. 将数据库数据导出到SD卡上的XML文件
  3. 使用Android备份机制将整个数据库备份到Google云端
  4. 现在我想知道你们对这三种解决方案的看法,或者你们知道另一种解决方案(也许是更好的方法),你眼中的最佳方式是什么?

    以下是我对可能的实施的评论:

    1. 我不知道手机是否没有根据可以恢复数据库文件......否则我认为没有任何不利因素......
    2. 在Android手机上动态处理XML文件很重,如果可以避免,最好不要那样做
    3. 使用Android备份机制时,备份功能仅在手机上的用户启用时才可用,并且所有数据都应该复制到云端......在我的情况下,在某些情况下可能会相当多。 ..
    4. 我期待在这个问题上看到一些意见!

      提前致谢!

      氪,

      德克

2 个答案:

答案 0 :(得分:0)

您无需使用root电话即可从SD卡上的文件还原数据库。每个应用程序都可以写入自己的私有目录,因此您只需复制该文件即可。至于2,你有没有具体的数字?处理XML是相当快的,因为它是备份/恢复,它不会经常发生,用户会期望它需要一些时间,所以它不应该是一个问题。像往常一样,在做出任何决定之前,测量实际花费的时间并考虑您拥有的数据量。

答案 1 :(得分:0)

我总是使用1.)。这是我的一类,它将DB备份到SD卡。我在这里使用来自Apache commons-io的FileUtils,你需要改变它,如果你不使用那个jar。此外,SQLiteOpenHelper类(此处为MySQLiteOpenHelper.getDatabaseName())中需要一个返回数据库文件名称的方法。

您将在一个活动中的AsyncTask中调用它...

public class MyDatabaseTools {
  private String appName = "";
  private String packageName = "";

  public boolean backup() {
    boolean rc = false;

    boolean writeable = isSDCardWriteable();
    if (writeable) {
      File file = new File(Environment.getDataDirectory() + "/data/" + packageName + "/databases/" + MySQLiteOpenHelper.getDatabaseName());

      File fileBackupDir = new File(Environment.getExternalStorageDirectory(), appName + "/backup");
      if (!fileBackupDir.exists()) {
        fileBackupDir.mkdirs();
      }

      if (file.exists()) {
        File fileBackup = new File(fileBackupDir, MySQLiteOpenHelper.getDatabaseName());
        try {
          fileBackup.createNewFile();
          FileUtils.copyFile(file, fileBackup);
          rc = true;
        } catch (IOException ioException) {
          //
        } catch (Exception exception) {
          //
        }
      }
    }

    return rc;
  }

  private boolean isSDCardWriteable() {
    boolean rc = false;

    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
      rc = true;
    }

    return rc;
  }

    public MyDatabaseTools(final Context context, final String appName) {
        this.appName = appName;
        packageName = context.getPackageName();
    }
}