到目前为止,我一直在尝试将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。
答案 0 :(得分:4)
Parameters可以在允许使用文字值的任何地方使用;你的SQL查询本身看起来很好。
但是,Android数据库API会强制您使用字符串参数,因此所有参数值都将被数据库视为字符串。 这将使许多比较失败,或者破坏对这些值进行的其他操作。
参数对于字符串最重要,可能存在格式问题和SQL注入攻击。对于普通数字,您可以直接将它们插入SQL字符串中。 或者,convert将字符串值重新标记为数据库中的数字:
MakePointZ(CAST(? AS REAL), CAST(? AS REAL), ...)
答案 1 :(得分:2)
有人可以确认在WHERE子句之外使用参数是错误还是解释我可以放置哪些参数?
?
替换适用于文字有效的任何地方。
在您的示例代码中,?
占位符和绑定参数的数量不匹配,这将导致异常。