2011-10-22 53 views
2

在Android的選擇和空如果我叫像下面的SQLiteDatabase方法查詢:的Android SQLite的查詢有問號在selectionArgs兩個

sqlitedb.query("mytable", null, "name = ?", 
    new String[] {null}, null, null, null); 

什麼是預期的結果?

我期望NullPointerException,但它似乎我得到一個遊標回來,似乎有與我執行的最後一個非空的selectionArgs查詢相同的數據。這是預期的行爲,我想我必須在調用此方法之前進行自己的空檢查,而是傳遞「name IS NULL」以獲得正確的結果?

回答

1

這與NPE @ satur9nine無關。它與SQL參數處理有關。我已經證實你是正確的。使用SQLite,如果您發出:

SELECT * FROM `mytable ` WHERE `name` = ? 

跨越其與空name場行的表空的說法,你會得到任何結果。您將不得不發出查詢:

SELECT * FROM `mytable ` WHERE `name` IS NULL 

這不僅僅是Android而且還是JDBC。這是一個數據庫問題。 SQLite,H2和MySQL都是這樣。從這個大SQL教程:

http://www.w3schools.com/sql/sql_null_values.asp

引述:

不可能測試對於NULL值與比較運算符,如=,<,或者<> 。

0

在java中,如果我做的:

String test1 = ""; 
    String test2 = null; 
    bool result = test1.equals(test2); 

結果將被設置爲false。沒有NullPointerException發生。這可能是正在發生的事情。爲了避免這種行爲,你應該像你在你的問題中所建議的一樣,確保檢查你的姓名字符串是否爲空。

+0

呃,這與@Kurtis無關。他正在談論SQL和SQLite的論點。 – Gray

+0

@格雷我想你錯了。我在我的答案中假設沒有空指針異常發生,因爲在Java比較「」和空字符串是有效的。他在他的問題中特別提到「爲什麼沒有空指針異常」。那怎麼不解決他在說什麼? –

+0

對不起,我錯過了。 _answer_不是關於Java對象測試,而是關於SQL參數處理和空值處理。 – Gray