SQLite绑定参数 - 它们仅限于WHERE子句吗?

时间:2014-01-31 11:45:05

标签: android sqlite prepared-statement android-sqlite spatialite

到目前为止,我一直在尝试将SQLite选择参数绑定在最佳实践建议的查询中。但它很少奏效。我很好奇确切的原因。现在我意识到它可能是由FROM子句中的子查询引起的。例如......

SELECT X(result) as x, Y(result) as y, Z(result) as z FROM (select Transform(MakePointZ(?, ?, 0.0, ?), ?) as result);

和Java代码类似......

double x, y, z;
int source, target;
final String[] selectionArgs = new String[] { 
                    String.valueOf(x),
                    String.valueOf(y), 
                    String.valueOf(z), 
                    String.valueOf(source), 
                    String.valueOf(target) };
Cursor c = db.rawQuery(sql, selectionArgs);

有人可以确认在WHERE子句之外使用参数是错误还是解释我可以放置哪些参数?

P.S。我实际上使用的是Spatialite,它是SQLite的扩展,但它基于一个纯粹的,未被触及的SQLite。

2 个答案:

答案 0 :(得分:4)

Parameters可以在允许使用文字值的任何地方使用;你的SQL查询本身看起来很好。

但是,Android数据库API会强制您使用字符串参数,因此所有参数值都将被数据库视为字符串。 这将使许多比较失败,或者破坏对这些值进行的其他操作。

参数对于字符串最重要,可能存在格式问题和SQL注入攻击。对于普通数字,您可以直接将它们插入SQL字符串中。 或者,convert将字符串值重新标记为数据库中的数字:

MakePointZ(CAST(? AS REAL), CAST(? AS REAL), ...)

答案 1 :(得分:2)

  

有人可以确认在WHERE子句之外使用参数是错误还是解释我可以放置哪些参数?

?替换适用于文字有效的任何地方。

在您的示例代码中,?占位符和绑定参数的数量不匹配,这将导致异常。