Добавить столбец в базу данных 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 в предоставленную вами строку?
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