2014-10-06 35 views
0

我得到了一個數據庫應用程序。SqliteDatabase處理程序 - 爲什麼第一次寫查詢需要比其他時間更長

它只被Application類調用一次,然後引用被轉發給需要它的人。當它初始化時,我打電話給db = this.getWritableDatabase();並將它打開。雖然簡單Double的每個寫入操作需要大約6-10 ms,但第一次需要30-50 ms,最多可達8倍。

這是怎麼回事?它是初始化嗎?我以爲打電話getWritableDatabase()會初始化我的一切?還是有另一個原因?我可以在什麼地方閱讀它,爲什麼以及它的行爲如何?

在此先感謝

編輯:爲了使這更清楚:值獲取數據庫處理程序的初始化之後寫入方式,所以動初始化將是長期過度。

編輯2:現在,我挖更深的話題,我發現兩兩件事:

  1. 據說查詢上沒有索引的表會慢一些。這總是如此嗎?不會android創建像sqlite_autoindex_tablename_1這樣的索引。這不是解決了嗎?
  2. getWritableDatabase()並沒有真正打開任何東西,只是當第一個遊標操作(如cursor.move())被執行時它真的被加載了嗎?那是對的嗎?

回答

0
public SQLiteDatabase getWritableDatabase() 

創建和/或打開將用於讀取和寫入數據庫。第一次被調用,數據庫將被打開,

onCreate(SQLiteDatabase), 
onUpgrade(SQLiteDatabase, int, int) and/or 
onOpen(SQLiteDatabase) will be called. 

一旦成功打開,數據庫緩存,所以您可以在每次需要寫入到數據庫時調用此方法。 (請確保在不再需要數據庫時調用close()。)

錯誤(如不正確的權限或完整的磁盤)可能會導致此方法失敗,但如果問題得到解決,未來的嘗試可能會成功。

數據庫升級可能需要很長時間,您不應該從應用程序主線程(包括ContentProvider.onCreate())調用此方法。 返回

讀/寫數據庫對象有效,直至關閉()被調用

Throws 

SQLiteException if the database cannot be opened for writing. 

我希望這是幫助你。

+0

嘿,謝謝你的回答,但儘管它確實是內容豐富的,但它並沒有幫助我。我的數據庫是用MyApplication對象創建的,據我所知,正好在應用程序的開頭。這是它調用getWritableDatabase的地方。即使這需要一些時間,但我的valueGenerator在它初始化之後(在創建數據庫之後沿着道路的某種方式)等待5秒鐘,然後它開始寫入值。所以數據庫已經被創建並且應該準備好,但是第一次寫入需要60ms。任何想法如何? – Ginbak 2014-10-06 11:49:11