Подтвердить что ты не робот

ДОБАВИТЬ КОЛОНКУ на sqlite db ЕСЛИ НЕ СУЩЕСТВУЕТ - flex/air sqlite?

У меня есть приложение 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 в строку, которую вы предоставили?

4b9b3361

Ответ 1

ALTER TABLE tbl_status ADD COLUMN status_default TEXT;

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

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

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

ДОБАВИТЬ ВКЛ:

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

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

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

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

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

Ответ 2

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

Я столкнулся с этой точной проблемой в реализации 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();

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

Ответ 3

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

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

PRAGMA user_version = 1

и вы получите его с помощью

PRAGMA user_version

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

Ответ 4

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

Ответ 5

Добавление " IF NOT EXISTS в мой запрос заставило его работать на меня.

Мой запрос SQL в моем файле .sql был:

ALTER TABLE results ADD caseid INT UNSIGNED DEFAULT 0;

и добавление IF NOT EXISTS заставило его работать:

ALTER TABLE results ADD caseid IF NOT EXISTS INT UNSIGNED DEFAULT 0;