2011-07-21 60 views
1

在我的應用程序,我存儲使用MySQLite數據庫用戶的應用數據,我允許用戶備份我的SD創建一個文件夾內的應用程序數據的SD卡卡(我們稱之爲MyAppFolder)。在只有一個SD卡插槽的Android設備上,一切正常(例如我的Droid)。如何處理一個以上的SD卡插槽

然而,在設備,如Galaxy S的具有超過1張SD卡,事情不工作。不幸的是,我實際上沒有這些設備之一,所以我無法調試任何東西,我只能通過用戶報告去。我也做了一些搜索,發現這是一個已知的問題。然而,我沒有找到任何解決方案,不涉及只是硬編碼的其他路徑,所以我正在尋找一些幫助。

在我的應用程序,我檢查,看看MyAppFolder已經存在。如果不是,我創建該文件夾。該文件夾始終創建成功,儘管它在存在2個插槽時由getExternalStorageDirectory()返回的「內部」內存插槽上創建。但是,文件不會被創建並複製到那裏。我不明白爲什麼文件夾被創建,但文件沒有創建。

誰能告訴我怎樣才能修改這個代碼與2個插槽的設備工作,以及1卡插槽?我不想硬編碼位置檢查,但如果這是唯一的方法,我會做,只是爲了讓事情工作。

這裏是我使用的代碼(略作修改,以使其可讀性更強這裏):

File root = Environment.getExternalStorageDirectory(); 
String state = Environment.getExternalStorageState(); 
if(Environment.MEDIA_MOUNTED.equals(state)) 
{ 
    File dataDirectory = Environment.getDataDirectory(); 
    if (root.canWrite()) 
    { 
     String savePath = root + "/MyAppFolder/"; 
     File directory = new File(savePath); 
     if(!directory.exists()) 
     { 
      directory.mkdirs(); //folder created successfully 
     } 

     String currentDBPath = "\\data\\my_app\\databases\\database.db"; 

     File currentDB = new File(datDirectory, currentDBPath); 
     File backupDB = new File(savePath, "database.db"); 

     if (currentDB.exists()) 
     { 
      FileChannel src = new FileInputStream(currentDB[i]).getChannel(); 
      FileChannel dst = new FileOutputStream(backupDB[i]).getChannel(); 

      dst.transferFrom(src, 0, src.size()); 

      src.close(); 
      dst.close(); 
     } 
    } 

回答

0

有人能告訴我怎樣可以修改這個代碼,以用於與2個插槽的設備工作,以及1個卡槽?

「外部存儲」並不意味着「可移動存儲」。 「外部存儲」意味着「可安裝存儲」 - 即IOW,當用戶通過USB電纜將設備插入主機時,用戶可以訪問該存儲。

Android目前的設計允許開發人員寫東西到一個外部存儲點,並且由設備製造商決定是固定閃存還是可移動的。因此,你應該支持外部存儲,而不是認爲你是在支持SD卡。

有人能告訴我如何修改此代碼以適用於具有2個卡槽以及1個卡槽的設備嗎?

使用getDatabasePath()來獲取數據庫路徑,而不是您目前正在經歷的迴轉。不要使用連接來創建路徑,與root + "/MyAppFolder/"一樣 - 使用File構造函數,就像您在其他地方一樣。確保您持有WRITE_EXTERNAL_STORAGE權限。除此之外,無論設備有多少「卡槽」,對於任何具有足夠外部存儲空間來容納數據庫的設備而言,這都可以正常工作。

+0

謝謝。問題雖然:你是否建議,如果我創建目錄作爲文件目錄=新文件(Environment.getExternalStorageDirectory(),「MyAppFolder」);並使用getDatabasePath()而不是內部數據庫路徑,這將使Galaxy S(和類似的設備)的工作?我知道這是一種更清晰的代碼編寫方式,但最終,究竟發生了什麼變化,這將允許文件成功寫入,目前尚未完成?我有權限設置,這對我的Droid和模擬器很好。我得到了代碼更改。但是,什麼行爲正在改變? – Michael

+0

@Michael:我不知道在寫入「Galaxy S(和類似設備)」上的外部存儲時有任何問題。如果沒有人能夠在這些設備上寫入外部存儲器,我就會聽說它。哎呀,你會聽說過這個消息,因爲這樣的錯誤已經被主要媒體報道。我只是指出了我所發佈的內容中的一些古怪,希望它能幫助您追蹤代碼中存在的問題以及它如何訪問外部存儲。 – CommonsWare

+0

再次感謝。指向我的用戶將他的設備連接到電腦。他說他可以看到兩個驅動器,並可以看到MyAppFolder坐在那裏。但文件夾內沒有文件。那麼,我相信,如果文件夾可以成功創建,那麼這些文件應該能夠被創建嗎?當您嘗試在getExternalStorageDirectory()返回的區域創建文件時,是否遇到過任何可能導致失敗的常見肇事者?我不明白爲什麼代碼可以在Droid上工作,但不是Galaxy S,那全是 – Michael