Можете ли вы удалить столбцы в базе данных SQLite? - PullRequest
3 голосов
/ 29 июля 2011

Приложение для Android, над которым я сейчас работаю, динамически добавляет столбцы в базу данных SQLite. У меня проблема в том, что я не могу найти способ удалить эти столбцы из базы данных.

Если я добавлю столбцы A, B, C, D и E в базу данных, возможно ли позднее удалить столбец C?

Я много раз осмотрелся, и самым близким, что я смог найти, было решение, которое требует построения таблицы резервных копий и перемещения всех столбцов (кроме того, который необходимо удалить) в эту таблицу резервных копий.

Хотя я не могу понять, как бы я это сделал. Я добавляю все столбцы динамически, чтобы их имена не определялись как переменные в моем коде Java. Кажется, что нет способа извлечь имя столбца с помощью Android-базы данных SQLite.

Ответы [ 6 ]

1 голос
/ 14 марта 2018

SQLite имеет ограниченную поддержку ALTER TABLE, которую можно использовать для добавления столбца в конец таблицы или для изменения имени таблицы.

Если вы хотите внести более сложные изменения в структурутаблица, вам придется воссоздать таблицу.Вы можете сохранить существующие данные во временную таблицу, удалить старую таблицу, создать новую таблицу, а затем скопировать данные обратно из временной таблицы.

Например, предположим, что у вас есть таблица с именем "t1" симена столбцов "a", "b" и "c" и которые вы хотите удалить из этой таблицы столбец "c".Следующие шаги иллюстрируют, как это можно сделать:

BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,b);
INSERT INTO t1_backup SELECT a,b FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b);
INSERT INTO t1 SELECT a,b FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;
1 голос
/ 29 июля 2011

Исходя из вашего комментария ниже о добавлении столбца для каждого события, я настоятельно рекомендую создать вторую таблицу, в которой каждая строка будет представлять событие, а затем отслеживать посещаемость, сохраняя идентификатор строки пользователя и идентификатор событиястрока в таблице посещаемости.Постоянное накопление столбцов в таблице посещаемости является определенным препятствием.

1 голос
/ 29 июля 2011

Ох ... только что заметил этот комментарий:

Приложение (в основном) - это таблица отслеживания посещаемости. Можете добавить новое «событие», а затем указать людей, которые посетили или нет. Столбцы являются «событиями».

На основе этого комментария вы должны просто создать другую таблицу для своих событий и связать ее с другими таблицами. Вы никогда не должны добавлять столбцы для поддержки новых объектов домена. Каждый объект логического домена должен быть представлен своей собственной таблицей. Например. пользователь, местоположение, событие ...

Первоначально писал это. Сохраните, если вам интересно:

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

Модели данных EAV хранят значения в виде пар имя / значение, и структура БД не нуждается в изменении.

1 голос
/ 29 июля 2011

SQLite не поддерживает способ удаления столбца в своем синтаксисе SQL, поэтому его вряд ли можно найти в API-оболочке. SQLite не всегда поддерживает все функции, которые поддерживают традиционные базы данных.

Решения, которые вы определили, имеют смысл и являются способами сделать это. Уродливые, но действительные способы сделать это.

Вы также можете «отказаться от» столбцов и не использовать их по соглашению в более новых версиях вашего приложения. Таким образом, старые версии вашего приложения, которые зависят от столбца C, не сломаются.

0 голосов
/ 29 июля 2011

Согласно SQLite FAQ , команда ALTER TABLE SQL имеет ограниченную поддержку.Таким образом, единственный способ сделать это - сохранить существующие данные во временную таблицу, удалить старую таблицу, создать новую таблицу, а затем скопировать данные обратно из временной таблицы.

Также вы можетеполучить имя столбца из базы данных с помощью запроса.Любой запрос «SELECT * FROM» дает вам объект cursor .Вы можете использовать метод

String getColumnName(int columnIndex);

или

String[] getColumnNames();

для получения имен столбцов.

0 голосов
/ 29 июля 2011

Что касается того, как узнать о схеме таблицы, вы можете запросить таблицу sqlite_master, как описано в этом другом вопросе SO - Существует ли SQLite, эквивалентный описанию MySQL DESCRIBE [таблица]?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...