2

到目前爲止,我一直在嘗試很多次,像最佳實踐所暗示的那樣在查詢中綁定SQLite選擇參數。但它很少奏效。我很好奇的確切原因。現在我意識到它可能是由FROM子句中的子查詢造成的。例如...SQLite綁定參數 - 它們是否僅限於WHERE子句?

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

和Java代碼是一樣的東西......如果使用外WHERE子句是錯誤的論點或

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); 

有人能證實解釋我這裏的參數是罰款放置?

P.s.我實際上使用了Spatialite,它是SQLite的擴展,但它基於純粹且未觸及的SQLite。

+0

請出示執行查詢的代碼。 –

+0

剛剛更新了問題。 – WindRider

回答

4

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

但是,Android數據庫API強制您使用字符串參數,因此數據庫將所有參數值視爲字符串。 這將使許多比較失敗,或打破對這些值所做的其他操作。

參數對於格式化問題和SQL注入攻擊是可能的字符串最重要。對於普通數字,您可以直接將它們插入到SQL字符串中。 另外,convert的字符串值返回到數據庫中的數字:

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

有人可以確認在WHERE子句之外使用參數是錯誤還是解釋我可以放置哪些參數?

?只要文字有效,替代就可以工作。

在您的示例代碼中,?佔位符和綁定參數的數量不匹配,並且會導致異常。