Запрос SQLite для Android имеет вопросительный знак в селекторе и ноль в selectionArgs - PullRequest
2 голосов
/ 23 октября 2011

В Android, если я вызываю запрос метода SQLiteDatabase следующим образом:

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

Каков ожидаемый результат?

Я ожидал бы NullPointerException, но мне кажется, что явозвращение курсора, который, кажется, содержит те же данные, что и последний ненулевой запрос selectionArgs, который я выполнил.Является ли это ожидаемым поведением, я полагаю, что перед вызовом этого метода я должен выполнить собственную проверку на нуль и вместо этого передать «name IS NULL», чтобы получить правильный результат?

Ответы [ 2 ]

1 голос
/ 24 октября 2011

Это не имеет ничего общего с NPE @ satur9nine.Это связано с обработкой аргументов SQL.Я подтвердил, что вы правы.С SQLite, если вы введете:

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

с нулевым аргументом в таблице, в которой есть строки с полями NULL 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 голосов
/ 23 октября 2011

В Java, если я сделаю:

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

результат будет установлен в ложь.Нет NullPointerException происходит.Это, вероятно, то, что происходит.Чтобы избежать такого поведения, вы должны, как вы предложили в своем вопросе, убедиться, что ваша строка имени не пуста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...