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

Java Android SQLite查询在选择器中有问号,在SelectionAgs中有null,java,android,sqlite,Java,Android,Sqlite,在android中,如果调用SQLiteDatabase方法查询,如下所示: sqlitedb.query("mytable", null, "name = ?", new String[] {null}, null, null, null); 预期的结果是什么 我希望出现一个NullPointerException,但似乎我要返回一个游标,它似乎与我执行的上一个非null SelectionAgs查询具有相同的数据。如果这是预期的行为,我想我必须在调用此方法之前进行自己的null检

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

sqlitedb.query("mytable", null, "name = ?",
     new String[] {null}, null, null, null);
预期的结果是什么

我希望出现一个
NullPointerException
,但似乎我要返回一个游标,它似乎与我执行的上一个非null SelectionAgs查询具有相同的数据。如果这是预期的行为,我想我必须在调用此方法之前进行自己的null检查,而不是传递“name Is null”以获得正确的结果?

在java中,如果我这样做:

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

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

这与NPE@Satura9Nine无关。它与SQL参数生成有关。我已经证实你是对的。对于SQLite,如果您发布:

SELECT * FROM `mytable ` WHERE `name` = ?
如果表中的行具有null
name
字段,则在该表中使用null参数,则不会得到任何结果。您必须发出以下查询:

SELECT * FROM `mytable ` WHERE `name` IS NULL
这不仅是Android,也是JDBC。这是一个数据库问题。SQLite、H2和MySQL的行为都是这样的。从这个伟大的SQL教程:

引述:


不可能使用比较运算符测试空值,例如=,呃,这与@Kurtis无关。他说的是SQL和SQLite参数,我认为你错了。我在回答中的假设是,不会发生空指针异常,因为在java中,比较“”和空字符串是有效的。他在问题中特别提出“为什么没有空指针异常”。这怎么不符合他的意思?对不起,我说错了。答案不是关于Java对象测试,而是关于SQL参数处理和空值处理。@Gray啊,我们可以不同意我的答案,并(正如您所做的)提供您自己的答案。