2015-10-17 64 views
-1

我有一個已發佈的應用程序,它有一個sqlite數據庫,但我收到來自某些用戶的錯誤(超過99%的用戶沒有收到錯誤),但每天只有一兩個給我這個跟蹤:訪問sqlite時出現Android錯誤

java.lang.Error的:/data/data/(PACKAGENAME)/databases/(FILENAME).sqlite:打開失敗:ENOENT(沒有這樣的文件或目錄)

這是我的代碼:

private void copyDataBase() throws IOException { 
    InputStream myInput = myContext.getAssets().open(DB_NAME+".sqlite"); 
    String outFileName = Environment.getDataDirectory() + "/data/"+context.getPackageName()+"/databases/"+ DB_NAME+".sqlite"; 
    OutputStream myOutput = new FileOutputStream(outFileName); 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = myInput.read(buffer))>0){ 
     myOutput.write(buffer, 0, length); 
    } 
    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 
} 

我很困惑,因爲它與所有的智能手機的工作原理,但對有些人是不工作科爾ectly :(

+0

嘗試查看異常日誌和堆棧跟蹤以查找原因。 – Ron

回答

1

use SQLiteAssetHelper,而不是推出你自己的包 - 數據庫資產的邏輯。

但是,讓我們假裝現在洛杉磯市被一些超級惡棍挾持爲人質,那裏的城市將被遺忘,除非您實施自己的軟件包 - 數據庫中的資產代碼。而且,讓我們進一步假裝你喜歡洛杉磯。

在這種情況下,您將需要解決兩個問題。

首先,替換:

String outFileName = Environment.getDataDirectory() + "/data/"+context.getPackageName()+"/databases/"+ DB_NAME+".sqlite"; 

有:

File outFile=myContext.getDatabasePath(DB_NAME+".sqlite"); 
outFile.getParentFile().mkdirs(); 

這不僅擺脫了字符串連接(如果你正在做一些假設),但它也適用於次要用戶帳戶(你的代碼可能不會,因爲getDataDirectory()的行爲沒有記錄)。它也更短。調用mkdirs()只是確保該目錄在繼續之前存在。

二,變:

myOutput.flush(); 
myOutput.close(); 

到:

myOutput.flush(); 
myOutput.getFD().sync(); 
myOutput.close(); 

這確保一切都在繼續之前寫入磁盤。 flush()只是將字節移出虛擬機到操作系統,但操作系統執行自己的文件系統級寫入緩存。 sync()通知操作系統將所有內容寫入磁盤。如果您有C/C++背景,sync()將調用POSIX fsync()

這些問題可能會導致您遇到的錯誤。可能還有其他原因,所以我不能保證這些將完全清除事情。

(同樣,除非你的數據庫是非常小的,我會增加byte[]了一下,8KB或16KB左右,以提高性能壓力。然而,這不大可能是導致你的錯誤。)

0

幾乎所有的設備已經目錄指定爲:

Environment.getDataDirectory() + "/data/"+context.getPackageName()+"/databases/"+ DB_NAME+".sqlite";

但是,我們應該檢查是否(目錄),它存在與否。 所以首先檢查目錄是否存在,如果不存在,創建目錄。代碼如下:

String dir="/data/"+context.getPackageName()+"/databases/"; 
File file = new File(dir); 
if(file.exists()==false){ 
    //directory does not exist 
    boolean result = file.mkdirs(); 
}else{ 
    //file is exist 
} 
相關問題