2011-09-11 83 views
5

我目前正在尋找在我的Android應用程序中建立一個備份功能。然而,即使開始實施它,我也有點掙扎,因爲我不確定正確的路要走多遠。Android備份和恢復數據庫往返SD卡

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

  1. 備份整個DB文件到SD卡
  2. 出口的DB-數據上的XML文件SD卡
  3. 中使用Android備份機制來備份整個DB到谷歌雲

現在,我想知道你們想想這些解決方案3,或者你知道其他(M還有更好的辦法),你眼中的最好方法是什麼?

下面是我對可能實現的話:

  1. 我不知道,如果手機沒有紮根,它是可以恢復的數據庫文件......否則不會有任何真正的下跌我覺得這一點...
  2. 在Android手機上處理XML文件是沉重的,所以如果可以避免,最好不要這樣做
  3. 使用Android備份機制,備份功能僅可用如果它是由用戶在手機上啓用的,並且所有的數據都應該被複制到雲端......在我的情況下,在某些情況下可能相當很多...

我期待在這個問題上看到一些輸入!

在此先感謝!

KR,

德克

回答

0

我總是用1.)。這是我的一個類,它可以將數據庫備份到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(); 
    } 
} 
+0

這個例子與我在研究中發現的例子類似。我可能會這樣。謝謝您的幫助! – dirkvranckaert

+0

這沒有提到恢復數據庫。 –

+0

@Harald,我明白你的答案。它有助於開發它。但你可以分享你的建議,當我們必須將數據庫移動到另一個目錄,如卸載時間安裝時間等?等待你的積極反饋 –

0

你並不需要有一個根深蒂固的手機,從SD卡上的文件恢復數據庫。每個應用程序都可以寫入它自己的專用目錄,因此您可以複製該文件。至於2,你有沒有具體的數字?處理XML相當快,而且由於它是備份/恢復,所以它不會經常發生,用戶會期望它需要一些時間,所以它不應該是一個問題。像往常一樣,在做出任何決定之前,測量實際需要的時間並考慮您擁有的數據量。

+0

好,但如果1)是可能的,那麼爲什麼要一個甚至花時間創建一些通用的東西備份所有表和他們的數據,而不僅僅是複製整個數據庫?這有沒有已知的缺點? – dirkvranckaert

+0

這取決於,如果你不需要它,不要寫它。也許你需要在其他程序中導入你的數據,而XML/CSV/JSON可能是更好的選擇。這是不太可能的,但Android 5.0中的SQLite版本可能與當前格式不兼容等。 –