簡體   English   中英

Android備份和還原SD卡的數據庫

[英]Android backup and restore database to and from SD-card

我目前正在尋找在我的Android應用程序中構建備份功能。 然而,在開始實施它之前,我有點掙扎,因為我不確定正確的方法是什么。

我在網上發現了一些有趣的文章,所以我提出了三種可能的解決方案:

  1. 將整個DB文件備份到SD卡
  2. 將DB數據導出到SD卡上的XML文件
  3. 使用Android備份機制將整個數據庫備份到Google雲

現在我想知道你們對這三種解決方案的想法,或者你知道另一種解決方案(也許是一種更好的方法)以及你眼中最好的方法是什么?

以下是我對可能的實現的評論:

  1. 我不知道手機是否沒有根據可以恢復數據庫文件...否則我認為沒有真正的任何不利因素...
  2. 在Android手機上動態處理XML文件很重,如果可以避免,最好不要這樣做
  3. 使用Android備份機制,備份功能僅在用戶在手機上啟用時才可用,並且所有數據都應該復制到雲端......在我的情況下,在某些情況下可能會有很多...

我期待在這個問題上看到一些意見!

提前致謝!

KR,

短劍

您無需使用root電話從SD卡上的文件還原數據庫。 每個應用程序都可以寫入自己的私有目錄,因此您只需復制該文件即可。 至於2,你有沒有具體的數字? 處理XML是相當快的,因為它是備份/恢復,它不會經常發生,用戶會期望它需要一些時間,所以它不應該是一個問題。 像往常一樣,在做出任何決定之前,測量實際花費的時間並考慮您擁有的數據量。

我總是使用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();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM