2014-01-16 50 views
2

我想備份我的應用程序數據庫在sdcard並稍後導入它。 .sqlite db由ORMLite管理。我已經閱讀了回答https://stackoverflow.com/a/20143148/335105,但按照這種方法將刪除導出後生成的當前數據庫中的所有數據。備份/恢復Android應用數據庫由ORMLite管理

有沒有一種方法可以將我的數據庫導出到SD卡,稍後導入它而不會丟失已經包含的數據?建議?

+1

不得不在現有的應用程序上開發一個手動導入/導出系統,這不是很漂亮......嘆! –

回答

1

如果您知道您的數據模型稍後不會更改,您可以創建數據庫的「啞」導出。 DB作爲文件存儲在

public static final String CURRENT_DATABASE_PATH = "data/data/" + App.getContext().getPackageName() + "/databases/" + DatabaseHelper.DATABASE_NAME 

其中DATABASE_NAME是創建數據庫時使用的名稱。

下面是我使用的方法(我不是一個作家,這個代碼是強烈一些其他計算器線程,我現在不能找到inspirated) 出口:

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; 
    } 

不過,如果你打算更新您的數據模型,這種方法是行不通的,所以你可能需要manualy導出/導入你想要的一切。

編輯:AppStorage是我的自定義數據包封裝。這種方法不會刪除你的數據庫。

+0

App.getContext()。getPackageName()中的應用程序是什麼? – KJEjava48

+0

在這種情況下,App是擴展Application框架類的類。我在類App中擁有對常規上下文的靜態引用,所以它始終可用於應用程序(可通過getContext()方法訪問) – vanomart