Android SQLite查询在选择器中有问号,在selectionArgs中有null

时间:2011-10-22 22:31:44

标签: java android sqlite

在android中,如果我调用SQLiteDatabase方法查询,如下所示:

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

预期结果是什么?

我希望有一个NullPointerException但似乎我得到的光标似乎与我执行的最后一个非null selectionArgs查询具有相同的数据。这是预期的行为,我想我必须在调用此方法之前进行自己的空检查,而是传递“name IS NULL”以获得正确的结果?

2 个答案:

答案 0 :(得分:1)

这与NPE @ satur9nine无关。它与SQL参数procressing有关。我已经证实你是对的。使用SQLite,如果您发出:

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

在包含空name个字段的行的表中使用null参数,您将得不到任何结果。您将不得不发出查询:

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

这不仅仅是Android,还有JDBC。这是一个数据库问题。 SQLite,H2和MySQL都以这种方式运行。从这个伟大的SQL教程:

  

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

引用:

  

无法使用比较运算符测试NULL值,例如=,<或<>。

答案 1 :(得分:0)

在java中,如果我这样做:

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

结果将设置为false。不会发生NullPointerException。这可能是正在发生的事情。为了避免这种行为,您应该按照问题中的建议确保检查您的名称字符串是否为空。