2013-06-18 50 views
0

我決定更新我的應用程序及其數據庫,但在執行下面的代碼並運行該應用程序後,我得到的數據庫在一個陌生的方式複製 - 一些地方被複制,有些則不是。SQlite的DATABSE更新不能正常工作

我什麼迷得最多的是,雖然在我的Nexus出現問題everyting完美的作品在模擬器上。

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    try { 
     copyDatabase(); 
    } catch (IOException e) { 
     throw new Error("Error copying database" + e.toString()); 
    } 
} 

public void copyDatabase() throws IOException { 
    // Open your local db as the input stream 
    InputStream myinput = myContext.getAssets().open(DB_NAME); 

    // Path to the just created empty db 
    String outfilename = DB_PATH + DB_NAME; 

    // Open the empty db as the output stream 
    OutputStream myoutput = new FileOutputStream(outfilename); 

    // transfer byte to inputfile to outputfile 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = myinput.read(buffer)) > 0) { 
     myoutput.write(buffer, 0, length); 
    } 

    // Close the streams 
    myoutput.flush(); 
    myoutput.close(); 
    myinput.close(); 
} 

回答

0

當然,它會更好地做SELECT *,並通過它們存儲在一個臨時位置第一,而不是這樣直接排放到新的數據庫。如果您更改表格模式,會發生什麼?

而且,這不就是打開該文件,並覆蓋它,你走? outfilename看起來與DB路徑相同。

+0

你傢伙還真真棒。我已經意識到,我已經改變了我的表架構在此期間,當我回到以前的版本,一切都開始正常工作。你能解釋我發生了什麼事嗎? –

+0

不要以爲數據庫作爲中有你行「平面文件的存儲的。有很多包含.db文件中的元信息(見http://www.sqlite.org/fileformat.html一看到底是什麼)。你不感興趣,此存儲元數據信息,這實際上是問題是什麼,這就是爲什麼我建議傾銷的實際*數據*代替。 – Dororo

+0

請你給我提供了一些Android的代碼,打開數據庫時,因爲我的應用程序崩潰。我得到‘數據庫磁盤映像格式有誤’?肯定會得到你的想法,但不熟悉implementationatin。提前致謝! –

0

你的偏移是始終爲0

所以你總是複製前1024個字節的myinput