2014-12-03 63 views
0

我有問題的原始查詢中的綁定參數值可能爲空。 所以我接下來準備聲明:Android的SQLite原始查詢綁定

String ss="SELECT * FROM Table1 WHERE ifnull(column1,-1) = ? "; 

如果我執行它像我有,我沒有得到任何結果

cursor = database.rawQuery(ss, new String[]{Long.toString(columnID)}); 

,但如果我手動替換問號這樣的:

ss=ss.substring(0,ss.indexOf('?'))+Long.toString(columnID)+ss.substring(ss.indexOf('?')+1); 
cursor = database.rawQuery(ss, null); 

我得到正確的結果,做任何一個現在是什麼原因呢?

+0

嘗試在SS問號之後移除空間。有時SQLite對這些事情是非常明智的。 – 2014-12-03 16:15:53

+2

@CarlosJ在字符串之外,空間永遠不會受到傷害。 – 2014-12-03 16:34:44

+0

請看我對這個問題的答案:https://stackoverflow.com/questions/41092903/use-blob-field-as-query-parameter-in-sqlite/47908283#47908283 – awattar 2017-12-20 14:39:38

回答

1

Android數據庫API僅支持字符串作爲參數,因此您的column1值不會被找到,除非它們是字符串。

普通整數沒有格式問題,並不能導致SQL注入,這樣你就可以直接與他們簡單地寫入到SQL查詢:

String ss = "SELECT * FROM Table1 WHERE ifnull(column1,-1) = " + columnID; 
cursor = database.rawQuery(ss, null); 
+0

是的,我知道,但我轉換長字符串,以便應該工作。如果我忽略空值,我做了這樣的選擇: String ss =「SELECT * FROM Table1 WHERE column1 =?」; 綁定完美地工作,但在這種情況下,空值將被忽略,並且如果我想要的話,我不會在數據庫的column1上獲得具有空值的行 – user2704821 2014-12-05 08:17:27

+0

NULL不能與'='進行比較,但這是一個不同的問題。 – 2014-12-05 09:09:21

+0

是的,我知道這一點,但我以前的評論指出,只是,龍的轉換爲字符串工作良好的綁定在第二種情況下,但不是在第一種情況下,當我有選擇語句ifnull(column1,-1) – user2704821 2014-12-05 19:43:47