У меня есть приложение, где я обнаруживаю тип конкретного столбца во время выполнения, при загрузке страницы. Пожалуйста, обратитесь к приведенному ниже коду:
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", но все равно получал ту же ошибку.
Проверьте, является ли это правильным способом динамического изменения типа.
Пожалуйста, ответьте, если у кого-то есть решение.
Заранее спасибо.
Вкратце, решение может быть: -
CAST(mycolumn AS TEXT)
(как используется ниже)С SQLite существуют ограничения на то, что можно изменить. Короче говоря, вы не можете изменить столбец. Alter позволяет только переименовать таблицу или добавить столбец. Согласно :-
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;
Результат: -
Как таковой существует необходимость вообще изменить тип столбца?
Если вышеуказанное недостаточно, то ваш единственный вариант - создать новую таблицу с новыми определениями столбцов, заполнить ее, если требуется, из исходной таблицы, а затем заменить исходную таблицу на новую таблицу (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;
В результате: -
Я думаю, что запрос SQL-запроса неверен, попробуйте
ALTER TABLE tblUsers MODIFY COLUMN id TYPE integer USING (id::integer);
вместо id использовать имя столбца....
надеюсь это поможет....
РЕДАКТИРОВАТЬ:
"ALTER TABLE tblUsers MODIFY COLUMN "+strColumnName+" TYPE integer USING ("+strColumnName+"::integer);"