Android中的SQL参数化查询

时间:2012-02-08 17:02:41

标签: android sql sqlite sql-injection

我一直在寻找Android中用于参数化查询的接口/类,这有点乱。

有人能说清楚其中最好的(也是最安全的):

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

任何人都可以解释为什么存在这么多,它们之间的区别是什么是为查询提供绑定参数的最佳方法?

1 个答案:

答案 0 :(得分:9)

  

我一直在寻找Android中用于参数化查询的接口/类,这有点乱。

不是。

  

有人能说清楚其中最好的(也是最安全的):

不,因为您尚未定义您认为“最佳”的标准。

  

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

就个人而言,我使用rawQuery(),因为我发现它是最具可读性的。恕我直言,query()更适用于您尝试从各个部分(例如,表名,列列表)构造SELECT语句的情况,因为可能其中一些是可变的(例如,不同用户的不同表) 。在一天结束时,他们都做同样的事情。 query()使用SQLiteQueryBuilder封面(见下文)。

  

使用SQLiteStatement   使用compileStatement()

这些都是一样的。 SQLiteStatement是Java所称的“类”。 compileStatement()是Java所称的“方法”。 compileStatement()方法返回SQLiteStatement类的实例。

SQLiteStatement通常对查询没用,因为除了单列/单行响应之外,它不能返回完整的结果集。

  

使用SQLiteQueryBuilder

这是从单个部分构造查询的另一种方法。在多方决定查询内容的情况下(例如ContentProviderContentProvider的使用者),此功能非常有用。除此之外,最后,它执行rawQuery()。因此,使用SQLiteQueryBuilder或直接使用rawQuery()的结果没有显着差异。

  

使用managedQuery()

这已被弃用,并且在任何情况下都与SQLiteDatabase无关。

  

使用ContentValues

这与针对SQLiteDatabase的查询无关。

  

任何人都可以解释为什么存在这么多

有些角色扮演不同的角色,在很多情况下与SQLiteDatabase的查询无关。

关于名单中的三个有效选项(rawQuery()query()SQLiteQueryBuilder),他们都做同样的事情:query()使用{{ 1}},SQLiteQueryBuilder使用SQLiteQueryBuilder。唯一的区别在于如何构造SQL rawQuery()语句。