Android - динамическое изменение типа столбца в базе данных SQLite во время выполнения

0

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

public String fncCheckColumnType(String strColumnName){
        db = this.getWritableDatabase();
        String strColumnType = "";
        Cursor typeCursor = db.rawQuery("SELECT typeof (" + strColumnName +") from tblUsers, null);
        typeCursor.moveToFirst();
        strColumnType = typeCursor.getString(0);
        return strColumnType;
}

Вышеуказанный метод просто определяет тип столбца с столбцом Name 'strColumnName'. В этом случае я получаю тип столбца.

Теперь я хочу изменить тип столбца на TEXT, если я получаю INTEGER как тип столбца. Для этого я попробовал следующий код:

public String fncChangeColumnType(String strColumnName){
        db = this.getWritableDatabase();
        String newType = "";
        Cursor changeCursor = db.rawQuery("ALTER TABLE  tblUsers  MODIFY COLUMN " + strColumnName + " TEXT", null);
        if (changeCursor != null && changeCursor.moveToFirst()){
            newType = changeCursor.getString(0);
        }

        return newType;
 }

Но при выполнении метода "fncChangeColumnType" я получаю эту ошибку, android.database.sqlite.SQLiteException: near "MODIFY": syntax error (code 1):, while compiling: ALTER TABLE tblUsers MODIFY COLUMN UserID TEXT

ПРИМЕЧАНИЕ. Я также заменил "MODIFY" на "ALTER", но все равно получал ту же ошибку.

Проверьте, является ли это правильным способом динамического изменения типа.

Пожалуйста, ответьте, если у кого-то есть решение.

Заранее спасибо.

Теги:
android-sqlite

2 ответа

0

Вкратце, решение может быть: -

  1. Ничего не делать (например, использовать гибкость SQLite)
    1. вы можете использовать CAST, например CAST(mycolumn AS TEXT) (как используется ниже)
  2. Создайте новую таблицу, чтобы заменить старую таблицу.

Пояснения.

С SQLite существуют ограничения на то, что можно изменить. Короче говоря, вы не можете изменить столбец. Alter позволяет только переименовать таблицу или добавить столбец. Согласно :-

Изображение 174551

SQL как понимается SQLite - ALTER TABLE

Однако, за исключением столбца, который является псевдонимом столбца rowid

  • один определяется ?? INTEGER PRIMARY KEY ?? INTEGER PRIMARY KEY или ?? INTEGER PRIMARY KEY AUTOINCREMENT ?? INTEGER PRIMARY KEY AUTOINCREMENT или ?? INTEGER... PRIMARY KEY(??) ?? INTEGER... PRIMARY KEY(??) (где? Представляет действительное имя столбца)

вы можете сохранить любой тип значения в любом типе столбца. например, рассмотрим следующее (в котором хранится INTEGER, REAL, TEXT, дата, заканчивающаяся TEXT и BLOB): -

CREATE TABLE IF NOT EXISTS example1_table (col1 BLOB);
INSERT INTO example1_table VALUES (1),(5.678),('fred'),(date('now')),(x'ffeeddccbbaa998877665544332211');
SELECT *, typeof(col1) FROM example1_table;

Результат: -

Изображение 174551

Как таковой существует необходимость вообще изменить тип столбца?

Если вышеуказанное недостаточно, то ваш единственный вариант - создать новую таблицу с новыми определениями столбцов, заполнить ее, если требуется, из исходной таблицы, а затем заменить исходную таблицу на новую таблицу (a) удалить оригинал и b) переименовать новый или a) переименовать оригинал, b) переименовать новый и c) удалить оригинал)

например: -

DROP TABLE IF EXISTS original;
CREATE TABLE IF NOT EXISTS original (mycolumn INTEGER);
INSERT INTO original VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(0);
-- The original table now exists and is populated

CREATE TABLE IF NOT EXISTS newtable (mycolumn TEXT); 
INSERT INTO newtable SELECT CAST(mycolumn AS TEXT) FROM original;
ALTER TABLE original RENAME TO old_original;
ALTER TABLE newtable RENAME TO original;
DROP TABLE IF EXISTS old_original;
SELECT *,typeof(mycolumn) FROM original;

В результате: -

Изображение 174551

0

Я думаю, что запрос SQL-запроса неверен, попробуйте

ALTER TABLE tblUsers MODIFY COLUMN id TYPE integer USING (id::integer);

вместо id использовать имя столбца....

надеюсь это поможет....

РЕДАКТИРОВАТЬ:

"ALTER TABLE tblUsers MODIFY COLUMN "+strColumnName+" TYPE integer USING ("+strColumnName+"::integer);"
  • 0
    Но вы не предоставляете имя столбца вообще.
  • 0
    не является "strColumnName" имя столбца?
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню