2013-07-09 72 views
6

我想讀取一個sqlite文件到內存中以獲得更好的性能,當關閉我的應用程序時我想把它寫回硬盤。備份和恢復SQLite從磁盤到Java中的內存

我在Java中使用了jdbc(3.7.2)驅動程序。

根據該文檔,我的代碼看起來像

this._conn = DriverManager.getConnection("jdbc:sqlite:"); 
Statement stat = this._conn.createStatement(); 
File dbFile = new File(this._config.GetDataBaseFile()); 
if (dbFile.exists()) { 
    this._logger.AddInfo("File exists."); 
    stat.executeUpdate("restore from " + dbFile.getAbsolutePath()); 
} 

文件存在(及其有效的sqlite的分貝),this._conn是開放的,但如果我想執行它的語句,似乎有裏面沒有表格和數據。它似乎並沒有恢復任何東西。

關於如何解決/進一步調試的任何建議?

(順便說一句 - 如果我我的連接上使用stat.executeUpdate("backup to test.db"),它備份我的空:內存:DB ...)

+0

該文件存在,它是一個有效的SQLite數據庫 - 但它包含任何表? – mthmulders

+0

是的,它的確如此。還有數據。 – RalphP

+0

@ mjreaper..did你找到這個代碼的解決方案?你能幫助我如何恢復? –

回答

0

它看起來像你缺少兩樣東西:周圍的文件名1)報價,和2)stat.close。請嘗試以下操作:

this._conn = DriverManager.getConnection("jdbc:sqlite:"); 
Statement stat = this._conn.createStatement(); 
File dbFile = new File(this._config.GetDataBaseFile()); 
if (dbFile.exists()) { 
    this._logger.AddInfo("File exists."); 
    stat.executeUpdate("restore from '" + dbFile.getAbsolutePath() + "'"); 
    stat.close(); 
} 

這是我能得到它與Xerial SQLite的JDBC版本3.7.15-M1的唯一方法。在這種情況下,我認爲版本並不重要。

0

的報價和stat.close()並不重要,根據鏈接:`https://bitbucket.org/xerial/sqlite-jdbc/wiki/Usage」,這我已經測試。不過,當文件路徑包含空格時,引號會有所幫助。

我想這可能是由於jdbc驅動程序造成的。嘗試Xerial的SQLite的JDBC驅動程序,這對我來說工作正常。