#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), однако произошло что-то странное.
После его добавления происходят следующие вещи:
SELECT * FROM TABLE_NAME
— Возвращает все строки (как и ожидалось)SELECT * FROM TABLE_NAME WHERE NEW_COLUMN_NAME=1
возвращает строки с NEW_COLUMN_NAME=1 (как и ожидалось). Однако,SELECT * FROM TABLE_NAME WHERE NEW_COLUMN_NAME=0
возвращает вновь вставленные строки (как и ожидалось).SELECT * FROM TABLE_NAME WHERE NEW_COLUMN_NAME!=1
возвращает ТОЛЬКО недавно вставленные строки (не старые строки)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
(и, возможно, значением по умолчанию), чтобы избежать некоторой путаницы и разочарования.