Android - динамическое изменение типа столбца в базе данных SQLite во время выполнения - PullRequest
0 голосов
/ 03 июля 2018

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

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;
}

Приведенный выше метод просто определяет тип столбца с именем столбца '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», но все еще получаю ту же ошибку.

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

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

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

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Короче говоря, решение может быть: -

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

Разъяснения.

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

enter image description here

SQL как понял SQLite - ALTER TABLE

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

  • один, определенный с ?? INTEGER PRIMARY KEY или ?? INTEGER PRIMARY KEY AUTOINCREMENT или ?? 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;

Результат: -

enter image description here

Как так, нужно ли вообще менять тип столбца?

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

например. : -

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;

Результат: -

enter image description here

0 голосов
/ 03 июля 2018

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

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

вместо идентификатора используйте имя столбца ....

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

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

"ALTER TABLE tblUsers MODIFY COLUMN "+strColumnName+" TYPE integer USING ("+strColumnName+"::integer);"
...