Добавить столбец в базу данных sqlite, если он не существует-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" уже существует".



Итак, как я могу добавить какой-то оператор A IF NOT EXISTS в предоставленную вами строку?

991   4  

4 ответов:

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(), которая будет выполнять необходимые изменения.

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

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

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

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

Я решил аналогичную задачу, используя ответ из этого вопроса: ALTER TABLE добавить столбец, если он не существует в SQLite

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

PRAGMA user_version = 1

И вы извлекаете его с помощью

PRAGMA user_version

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

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

Comments

    Ничего не найдено.