SQLiteDatabase.query是否使用PreparedStatements?

时间:2017-12-24 22:36:11

标签: android sqlite prepared-statement

当我使用Android中的用户输入查询我的数据库时,我通常使用SQliteDatabase.query,并正确使用SelectionArgs。

Cursor cursor = db.query(UserEntity.TABLE,
            new String[]{UserEntity.COLUMN_ID, UserEntity.COLUMN_USERNAME, UserEntity.COLUMN_FIRSTNAME,UserEntity.COLUMN_LASTNAME,...},
            UserEntity.COLUMN_USERNAME + "=?",
            new String[]{username},
            null, null, null);

是否足以阻止SQL注入?或者我之前应该使用PreparedStatements吗?

1 个答案:

答案 0 :(得分:1)

使用预准备语句的建议来自PHP,其中一些旧API不允许SQL参数(?),除非使用预准备语句。

但参数和预备语句是正交概念。要防止注入(并避免字符串/ blob格式化问题),您只需要参数。 (并query()为您提供。)

准备好的语句仅在您想多次执行时才有用。

(实际上,query()确实在内部使用了预准备语句,但这是SQLite API的结果,对您来说无关紧要。)