Android Sqlite После добавления столбца выбирает записи на основе условий

#android #sql #sqlite #null #alter-table

#Android #sql #sqlite #null #alter-таблица

Вопрос:

Итак, это произошло, когда я попытался пометить удаленные записи, чтобы они имели значение ‘deleted’, равное ‘1’, вместо того, чтобы удалять его.

Я добавил столбец в базу данных в своем приложении с помощью ALTER TABLE " TABLE_NAME " ADD COLUMN " NEW_COLUMN_NAME " " type ";"); и внес другие соответствующие изменения в поставщике базы данных (при вставке insert 0), однако произошло что-то странное.

После его добавления происходят следующие вещи:

  1. SELECT * FROM TABLE_NAME — Возвращает все строки (как и ожидалось)
  2. SELECT * FROM TABLE_NAME WHERE NEW_COLUMN_NAME=1 возвращает строки с NEW_COLUMN_NAME=1 (как и ожидалось). Однако,
  3. SELECT * FROM TABLE_NAME WHERE NEW_COLUMN_NAME=0 возвращает вновь вставленные строки (как и ожидалось).
  4. SELECT * FROM TABLE_NAME WHERE NEW_COLUMN_NAME!=1 возвращает ТОЛЬКО недавно вставленные строки (не старые строки)
  5. SELECT * FROM TABLE_NAME WHERE NEW_COLUMN_NAME=null ничего не возвращает.

Android не соответствуетhttp://www.sqlite.org/lang_expr.html или я что-то пропустил?

запускался в эмуляторе Android 2.2.

Спасибо.

Ответ №1:

Этот:

 SELECT * FROM TABLE_NAME WHERE NEW_COLUMN_NAME = null
  

Вернет пустую строку, установленную практически в любой базе данных, потому что в SQL выражение NULL = x равно false для всех x (даже для x нулевого значения). Попробуйте это вместо:

 SELECT * FROM TABLE_NAME WHERE NEW_COLUMN_NAME IS NULL
  

Аналогичные проблемы с нулевым значением будут применяться к этому:

 SELECT * FROM TABLE_NAME WHERE NEW_COLUMN_NAME != 1
  

итак, попробуйте:

 SELECT * FROM TABLE_NAME WHERE NEW_COLUMN_NAME != 1 OR NEW_COLUMN_NAME IS NULL
  

вместо этого.

Это не имеет ничего специфичного для SQLite или Android, это просто обычное поведение SQL. Если вам не обязательно разрешать значения NULL в ваших столбцах, создайте их с NOT NULL (и, возможно, значением по умолчанию), чтобы избежать некоторой путаницы и разочарования.