2011-11-15 87 views
0

對於一個相當綠色的問題,我很抱歉,但是我找不到解決方案。如何將數據庫從SD卡複製到//數據庫

我想從SD卡備份恢復數據庫。下面的代碼(一個在所以這裏提供了輕微的修改版本)

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

    if (sd.canWrite()) { 
     String currentDBPath = 
      "\\data\\com.dg\\databases\\" + com.dg.Constants.db_Table; 
     String backupDBPath = "com.dg"; 
     File currentDB = new File(data, currentDBPath); 
     File backupDB = new File(sd, backupDBPath); 

     if (currentDB.exists()) { 
      FileChannel dst = new FileInputStream(currentDB).getChannel(); 
      FileChannel src = new FileOutputStream(backupDB).getChannel(); 
      dst.transferFrom(src, 0, src.size()); 
      src.close(); 
      dst.close(); 
     } 
     line4.setText("Successful Import"); 
    } 
} catch (Exception e) { 
    line4.setText(e.toString()); 
} 

拋出NonWriteableChannelException即使數據庫文件未打開。

回答

0

你的數據一般是在

/data/data/com.dg/databases

你需要在路徑擺脫雙\的。另外,你使用Environment.getDataDirectory()作爲父目錄,然後使用「\ data \ com.dg \ databases \」(etc)作爲文件名。這完全錯了。

簡單的方法可能是在上下文(或活動)中的'getDatabasePath'。給它的數據庫的名稱,它應該給你一個文件引用它。但是,如果該文件不存在,我不知道該怎麼辦。

http://developer.android.com/reference/android/content/Context.html#getDatabasePath(java.lang.String

你也可以嘗試簡單的 'GETDIR( 「數據庫」,MODE_PRIVATE)'。這將有望返回數據庫目錄。

最後拉昇數據庫目錄,真髒:

File dbDir = new File(getFilesDir().getParentFile(), "databases"); 
+0

謝謝你的回答。這些目錄肯定是好的 - 我能夠首先使用幾乎相同的代碼進行備份。 (字符串「\\」在最終輸出中顯示爲\) – user1008771

+0

如果無法讀取/寫入文件,則它們不正確。你在unix系統上,所以反斜槓是錯誤的。他們可能在某些情況下工作,但那只是因爲Java正在彌補你的錯誤。認真。在Linux上,正斜槓。現在,您正在使用的表單中的File對象需要兩個參數。作爲父目錄的目錄和文件名。你傳遞一個目錄(錯誤的)和一個格式不好的目錄作爲文件名。嘗試新的文件(「/ data/data/[你的包]/databases/[你的db文件]」)。該表單採用完整路徑作爲字符串。 –

+0

謝謝,這很有道理。但是,問題依然存在。複製到該目錄上的任何其他位置(即/data/data/com.dg/databases/fakeDB)是成功的,但不是DB文件本身。這發生在數據庫第一次打開之前(飛濺活動) – user1008771

0

貴用戶/應用程序的權限,//數據庫? (如果沒有,那麼這就是答案

也許,這可能會告訴你爲什麼權限被拒絕:

IOException: Permission Denied

Bill Mote(從上面的鏈接)也指出以下權限設置:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+0

我的用戶不是root用戶,我沒有聲明任何權限(除了寫入外部存儲),但我找不到任何特殊的「數據庫訪問」權限。你知道我應該申報哪個權限嗎?數據庫工作正常,除了副本東西 – user1008771

+0

請參閱上面的答案。如果SD已經掛載,它將變成Android的「只讀」。 – Joshua

+0

提供的代碼是強制備份的,但不能從中恢復數據庫。我在使用SD卡的版本替換內部存儲器上的文件時遇到問題 – user1008771

相關問題