2

到目前为止,我已经多次尝试在查询中绑定 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 子句之外使用参数是否是错误的,或者向我解释这些参数可以放在哪里?

Ps 我实际上使用的是 Spatialite,它是 SQLite 的扩展,但它基于一个纯粹的、未受影响的 SQLite。

4

2 回答 2

4

参数可以用在任何允许字面值的地方;您的 SQL 查询本身看起来不错。

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

参数对于字符串来说是最重要的,在这种情况下可能出现格式化问题和 SQL 注入攻击。对于纯数字,您可以直接将它们插入 SQL 字符串中。或者,字符串值转换回数据库中的数字:

MakePointZ(CAST(? AS REAL), CAST(? AS REAL), ...)
于 2014-01-31T16:15:03.937 回答
2

有人可以确认在 WHERE 子句之外使用参数是否是错误的,或者向我解释这些参数可以放在哪里?

?只要文字有效,替换就起作用。

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

于 2014-01-31T15:18:15.320 回答