2012-11-13 55 views
6

我使用的是編譯SQLiteStatement與交易優化SQLite的交易記錄,但我閱讀了execute函數的文檔:SQLiteStatement執行SELECT /插入/刪除/ UPDATE

執行這條SQL語句,如果它不是一個SELECT /插入/刪除/ UPDATE,例如CREATE/DROP表,視圖,觸發器,索引等等

這似乎意味着,該函數不應該與SELECT/INSERT/DELETE/UPDATE語句一起使用,但我有 使用它與插入和工作的代碼。

我知道executeInsert和其他方法,但是executeUpdateDelete不適用於我的API級別,所以我可以使用execute

另外,如果我不需要最後一個插入ID或受影響的行數,我應該使用execute而不是executeInsert等,換句話說它更有效率?

回答

3

execute大概是不超過executeInsert快,甚至可能會比較慢(在ICS execute呼籲executeUpdateDelete和丟棄的返回值)。你需要測試一下,但我懷疑你會在這裏發現真正的區別。如果你不需要返回值,那麼使用execute是安全的,但我不會指望在未來的Android版本中保持真實。文件說不,所以也許有人會改變行爲以反映這一點。較老的實現似乎也使用execute(例如2.1 delete() sourcecode)。果凍豆例如改變a lot SQLite的幕後,但使用execute

時再說,如果你不使用相同的SQLiteStatement一遍又一遍,而只是重新綁定它可能不值得使用它的ARGS它應該仍然工作。每次撥打常規電話insertupdate,...時,建立一個新方法與實際的數據庫訪問和所需的磁盤I/O相比是快速的。事務另一方面有很多幫助,因爲每個語句在磁盤上同步數據庫狀態非常慢。

+0

所以,你的意思是不能保證'execute()'在將來也可以用'INSERT語句'發佈,也就是說它只是混淆了它說'執行這個SQL語句,如果它不是SELECT/INSERT/....'那麼它不應該執行'INSERT'(因爲這只是我測試過的語句)而且它的工作!並感謝您的有價值的信息:) –

+0

也'statement.executeUpdateDelete();'這在API 11中可用的任何解決方法爲2.2? –

+1

@MuhammadBabar文檔試圖告訴你,'execute'方法不適用於有結果的語句。就像爲select設置的行一樣,更新/刪除的更改計數或插入的最後一行ID。迄今爲止,還沒有能夠防止這些意外陳述發揮作用的代碼。也許未來對數據庫架構的改變會,我不知道。Android框架工程師可以輕鬆地在沒有通知的情況下添加這樣的更改,因爲該方法的說明警告您,自從多年以後,該方法將無法使用。 – zapl

1

使用SQLiteDatabase而不是SQLiteStatement與您的數據庫進行交互。 SQLiteStatements不是線程安全的,所以我不會將它們用於SELECT/INSERT/DELETE/UPDATE。此外,您應該嘗試不使用原始數據庫查詢以外的其他任何內容Selects。內置的幫助函數可以提高數據庫的性能。在你的實例SQLiteDatabase你有.insert,.update,.delete和我使用.rawQuery選擇。

+0

但不是'THREAD-SAFE'只暗示*多線程*應用程序。對於單線程,如果您想要批量插入,則值得使用。 –

+0

恩,每個帶有數據庫的應用都應該是多線程的。任何對磁盤,數據庫或Web服務的請求都應該在UI線程之外。如果您阻止UI線程進行批量插入,那麼您做錯了。 – JustinMorris

+0

我在談論除Main之外的線程。 –