Android Sqlite после добавления столбца Выберите записи на основе условий - PullRequest
2 голосов
/ 02 июня 2011

Так произошло, когда я попытался пометить удаленные записи как «удаленные» значения «1» вместо их удаления.

Я добавил столбец в базу данных в моем приложении, используя ALTER TABLE "+TABLE_NAME+" ADD COLUMN "+NEW_COLUMN_NAME+" "+type+";");, и сделал другие соответствующие изменения в поставщике базы данных (когда вставлена ​​вставка 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 Ответ

4 голосов
/ 02 июня 2011

Вот этот:

SELECT * FROM TABLE_NAME WHERE NEW_COLUMN_NAME = null

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

SELECT * FROM TABLE_NAME WHERE NEW_COLUMN_NAME IS NULL

Аналогичные проблемы 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 (и, возможно, по умолчанию), чтобы избежать путаницы и разочарований.

...