2014-11-20 34 views
0

我看,並試圖對同一個問題的迴應一打,和我有沒有運氣。我很確定,我正在嘗試做的事情,並不是火箭科學。複製文件從資產到/數據/數據

不幸的是,我不能使用我正在使用的設備,所以請不要在生根周圍留下任何意見,我只需要,如標題所示,將文件從/ assets /文件夾複製到我的/ data/data /目錄設備。

隨函附上的代碼我使用:

private void copyDatabase(File dbFile) throws IOException { 
    InputStream is = context.getAssets().open(DB_NAME); 
    OutputStream os = new FileOutputStream(dbFile); 

    byte[] buffer = new byte[1024]; 
    while (is.read(buffer) > 0) { 
     os.write(buffer); 
    } 

    os.flush(); 
    os.close(); 
    is.close(); 
} 

這真的是沒腦子,我有一個名爲DB_NAME靜態字段指向資產的文件夾。調試這一行,證明所需文件被識別併成功輸出到內存。

失敗的線是下一個:... new FileOutputStream(dbFile);我從另一個方法傳入。

DBFILE構造如下:

File dbFile = context.getDatabasePath(DB_NAME); 

再次,沒有什麼特別的。這抓住了當前上下文(應用程序)的數據庫的路徑和追加數據庫的名稱到,所以爭論的緣故,我們有,

/data/data/co.za.simple.sqlite/database/sqlitedb.db 

的錯誤消息,文件或目錄不存在,這對於任何將要下載應用程序的普通用戶的首次加載而言是好的,現在,默認行爲爲FileOutputStream(string),據我所知它是如果它不存在,它會創建它。

如上所述,第一次運行,該文件不存在,但它給我一個錯誤,說該文件或目錄找不到。這讓我相信實際的錯誤是應用程序沒有寫入/ data /目錄的權限,所以我添加了我在列表中看到的唯一權限,這適用於寫入存儲:

android.permission.WRITE_EXTERNAL_STORAGE 

然而,這絕對沒有影響。

如前所述,我不能根本設備和我也不會想在這一點上。

我已經瀏覽了無數的博客,YouTube視圖,甚至在這裏關於完全相同的問題,並且這些解決方案都不適用。

我錯過了什麼?

+0

看看這個帖子http://stackoverflow.com/questions/22903540/android-copy-files-from-assets-to-data-data-folder – Fareya 2014-11-20 22:45:15

回答

0

new FileOutputStream(stuff)預計,目錄把文件存在。如果它不存在但它不會創建路徑,它將創建該文件。缺少路徑的結果是FileNotFoundException

任何運行中的應用程序應該有一個現有/data/data/[packagename]/目錄。但是任何子目錄都是可選的。 context的大部分方法都會在您請求時爲您創建目錄。由於某些原因,getDatabasePath沒有。

創建流應該可以解決這個問題之前添加

dbFile.getParentFile().mkdirs(); 

。如果您不使用它,也可以刪除權限。你的私人目錄不需要任何。

或者使用https://github.com/jgilfelt/android-sqlite-asset-helper可以修復它,甚至更多的角落案例。

相關問題