2012-01-12 3 views
25

我正在開發一個android數據庫應用程序。我只想知道哪些代碼執行速度更快,它們之間有什麼區別?Android SQLite:哪個查詢(「查詢」或「rawQuery」)更快?

查詢 - 1 =

db.rawQuery("select * from user_table where user_id =" + userId, null); 

查詢 - 2 =

db.query(USER_TABLE_NAME, ALL_COLUMNS, "user_id = " + userId, null, null, null, null); 
+0

...試試看看?對於所有意圖和目的,我會猜測「相同」。但是,*請在任何一種情況下都使用佔位符*。 – 2012-01-12 05:58:21

+0

如果您已經建立了構建系統,請對其進行一些基準測試。另外,你期望什麼樣的工作量以及你在尋找什麼樣的速度? – 2012-01-12 06:09:56

回答

15

使用查詢。

Android預編譯查詢和使用太多不同的原始查詢可能會導致性能問題。

僅當絕對需要時才使用rawQuery。

此外,你的例子都有一個SQL注入的主要安全問題。

您應該清理userId。

最明顯的事情是讓Android的使用做到這一點:

db.query(USER_TABLE_NAME, ALL_COLUMNS, "user_id = ?", new String[] {userId}, null, null, null); 
+3

RE預編譯查詢:這些僅在使用PreparedStatement時適用。 Query()只是構建字符串並將其傳遞給rawQuery()。 – 2014-08-13 23:07:32

+0

嗯,PreparedStatement是爲了多次運行相同的查詢,真的,但我認爲某種優化也是由驅動程序執行的。我遇到一些錯誤,當使用多個不同的android抱怨抱怨提供了太多的聲明。 :) – 2014-08-15 20:25:57

+0

@JonAdams請幫我理解你的評論,'只適用於使用preparedstatement',我們在哪裏可以使用preparedstatement,而rawQuery可以實現同樣的效果? (即你可以把'?',並傳遞參數?) – Darpan 2015-04-24 05:54:16

5

在Android源望着SQLiteDatabase.java表明該查詢(..)最終調用QueryBuilder的構建查詢爲單個字符串,然後它基本上調用rawQuery()。他們應該大致相當,假設你也做了同樣的工作來建立你自己的陳述。