2012-02-08 100 views
5

我一直在尋找Android中的參數化查詢的接口/類,它有點混亂。Android中的SQL參數化查詢

有人能說清楚什麼是最好的(和最安全的)之間:

    使用SQLiteDatabase.query()使用SQLiteDatabase.rawQuery()
  • 使用SQLiteQueryBuilder使用SQLiteStatement
  • 使用compileStatement()
  • 使用managedQuery()
  • 使用ContentValues
  • 使用其他內容,例如execSQL()

任何人都可以解釋爲什麼有這麼多的存在,它們之間有什麼區別,什麼是最好的方式來綁定查詢參數?

回答

9

我一直在尋找Android中的參數化查詢的接口/類,它有點混亂。

不是。

有人能說清楚什麼是數一數二的(最安全):

沒有,因爲你沒有定義你認爲是「最佳」的標準。

使用SQLiteDatabase.query() 使用SQLiteDatabase.rawQuery()

就個人而言,這些中,我使用rawQuery(),因爲我發現它是最可讀的。恕我直言,query()更適用於您試圖從單個部分(例如表名,列的列表)中構造SELECT語句的情況,因爲可能有些部分是可變的(例如,針對不同用戶的不同表)。在一天結束時,他們都做同樣的事情。 query()使用SQLiteQueryBuilder(見下文)。

()

使用SQLiteStatement 使用compileStatement這是同樣的事情。 SQLiteStatement是Java被稱爲「類」的東西。 Java被稱爲「方法」的是compileStatement()compileStatement()方法返回SQLiteStatement類的實例。

SQLiteStatement對於查詢通常不是很有用,因爲它不能返回完整的結果集,除了單列/單行響應。

使用SQLiteQueryBuilder

這是建設從單件查詢的另一種方式。它適用於多方決定查詢內容的情況,例如ContentProvider和該ContentProvider的使用者。除此之外,最後它執行rawQuery()。因此,直接使用SQLiteQueryBuilder或使用rawQuery()的結果沒有顯着差異。

()

使用managedQuery

這已被棄用,在任何情況下是不相關的SQLiteDatabase

使用ContentValues

這有什麼好做對抗SQLiteDatabase查詢。

任何人都可以解釋爲什麼這麼多存在

一些服務於不同的角色,在具有無關針對SQLiteDatabase查詢許多情況下。

對於你的名單(rawQuery()query()SQLiteQueryBuilder)的三個有效的選項,他們都做同樣的事情:query()使用SQLiteQueryBuilderSQLiteQueryBuilder使用rawQuery()。唯一的區別在於SQL SELECT語句的構造方式。

+0

非常感謝,現在它更清晰一點! – 2012-02-08 20:27:33