Android中的SQL参数化查询

fru*_*rge 5 sql sqlite android sql-injection

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

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

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

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

Com*_*are 9

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

并不是的.

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

不,因为您没有定义您认为"最佳"的标准.

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

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

使用compileStatement()使用SQLiteStatement

这些都是一回事.SQLiteStatement是Java所谓的"类".compileStatement()是Java所指的"方法".该compileStatement()方法返回SQLiteStatement该类的实例.

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

使用SQLiteQueryBuilder

这是从单个部分构造查询的另一种方法.在多方可以决定查询中的内容(例如a ContentProvider和消费者)的情况下,它非常有用ContentProvider.除此之外,最后,它执行一个rawQuery().因此,使用SQLiteQueryBuilderrawQuery()直接使用的结果没有显着差异.

使用managedQuery()

这已被弃用,并且SQLiteDatabase无论如何都不相关.

使用ContentValues

这与针对a的查询无关SQLiteDatabase.

谁能解释为什么这么多存在

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

关于你的名单(按以上三种有效的选择rawQuery(),query()SQLiteQueryBuilder),他们都做同样的事情:query()用途SQLiteQueryBuilderSQLiteQueryBuilder使用rawQuery().唯一的区别在于如何SELECT构造SQL 语句.