ДОБАВЬТЕ КОЛОННУ в sqlite db, ЕСЛИ НЕ СУЩЕСТВУЕТ - flex / air sqlite? - PullRequest
11 голосов
/ 10 апреля 2010

У меня есть приложение flex / air, над которым я работаю, оно использует локальную базу данных sqlite, созданную при первом запуске приложения.

Я добавил некоторые функции в приложение, и в процессе мне пришлось добавить новое поле в одну из таблиц базы данных. У меня вопрос, как мне получить приложение для создания одного нового поля, которое находится в таблице, которая уже существует?

это строка, которая создает таблицу

stmt.text = "CREATE TABLE IF NOT EXISTS tbl_status ("+"status_id INTEGER PRIMARY KEY AUTOINCREMENT,"+" status_status TEXT)";

А теперь я хотел бы добавить поле status_default.

спасибо!

Спасибо - MPelletier

Я добавил предоставленный вами код, и он добавляет поле, но теперь при следующем перезапуске приложения я получаю сообщение об ошибке - «status_default» уже существует ».

Так как же я могу добавить что-то вроде оператора IF NOT EXISTS в предоставленную вами строку?

Ответы [ 4 ]

31 голосов
/ 10 апреля 2010
ALTER TABLE tbl_status ADD COLUMN status_default TEXT;

http://www.sqlite.org/lang_altertable.html

При этом добавление столбцов в SQLite ограничено. Вы не можете добавить столбец нигде, кроме последнего столбца в таблице.

Что касается проверки, если столбец уже существует, PRAGMA table_info(tbl_status); вернет таблицу, в которой перечислены различные столбцы вашей таблицы.

ДОБАВИТЬ НА:

Я использую стратегию в дизайне базы данных, которая позволяет мне определить, какие модификации требуются. Для этого вам понадобится новая таблица (назовите ее DBInfo) с одним полем (целое число, назовите ее SchemaVersion). Кроме того, в SQLite также есть внутреннее значение, называемое user_version, которое можно установить с помощью команды PRAGMA. Ваш код может при запуске программы проверить номер версии схемы и соответственно применить изменения, по одной версии за раз.

Предположим, функция называется UpdateDBSchema(). Эта функция проверит версию вашей схемы базы данных, обработает отсутствующую там DBInfo и определит, что база данных находится в версии 0. Остальная часть этой функции может быть просто большим коммутатором с разными версиями, вложенными в цикл (или другой доступной структурой). на платформу по вашему выбору).

Таким образом, для этой первой версии есть функция UpgradeDBVersion0To1(), которая создаст эту новую таблицу (DBInfo), добавит ваше поле status_default и установит SchemaVersion в 1. В вашем коде добавьте константу это указывает на последнюю версию схемы, скажем, LATEST_DB_VERSION, и установите ее равной 1. Таким образом, ваш код и база данных имеют версию схемы, и вы знаете, что вам нужно синхронизировать их, если они не равны.

Когда вам нужно внести еще одно изменение в свою схему, установите для константы LATEST_DB_VERSION значение 2 и создайте новую функцию UpgradeDBVersion1To2(), которая будет выполнять необходимые изменения.

Таким образом, ваша программа может быть легко портирована, может подключаться и обновлять старую базу данных и т. Д.

3 голосов
/ 24 июля 2014

Я знаю, что это старый вопрос ... однако.

Я столкнулся с этой проблемой в реализации SQLite в Adobe AIR. Я думал, что можно будет использовать команду PRAGMA для разрешения, но поскольку реализация Adobe Air не поддерживает команду PRAGMA, нам нужна альтернатива.

То, что я сделал, я думал, что стоит поделиться здесь, это:

var sql:SQLStatement = new SQLStatement();
sql.sqlConnection = pp_db.dbConn;
sql.text = "SELECT NewField FROM TheTable";
sql.addEventListener(SQLEvent.RESULT, function(evt:SQLEvent):void {
});

sql.addEventListener(SQLErrorEvent.ERROR, function(err:SQLErrorEvent):void {
    var sql:SQLStatement = new SQLStatement();
    sql.sqlConnection = pp_db.dbConn;
    sql.text = "ALTER TABLE TheTable ADD COLUMN NewField NUMERIC;";
    sql.execute();
    sql.addEventListener(SQLEvent.RESULT, function (evt:SQLEvent):void {
    });
});
sql.execute();

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 22 ноября 2017

В некоторых случаях я выполняю команду и получаю исключение для «дублирующего столбца». Просто быстрое решение, а не идеальное.

0 голосов
/ 22 февраля 2014

Я решил похожую проблему, используя ответ на этот вопрос: ALTER TABLE ADD COLUMN ЕСЛИ НЕ СУЩЕСТВУЕТ в SQLite

Используйте встроенный параметр user_version для отслеживания ваших обновлений. Вы устанавливаете это используя:

PRAGMA user_version = 1

и вы получаете его, используя

PRAGMA user_version

Таким образом, в основном получите user_version (по умолчанию 0), проверьте, равен ли он 0. Если да, выполните обновления и установите его на 1. Если у вас будет больше обновлений в будущем, проверьте, равно ли оно 1, выполните обновления и установите его до 0. И так далее ...

...