我有一个应用程序,在运行时在页面加载时检测特定列的类型。请参考以下代码:
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”的列的类型。我得到了这种情况下的列类型。
现在,如果我接收integer作为列类型,我想将列类型改为text。为此,我尝试了以下代码:
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条答案
按热度按时间ggazkfy81#
简言之,解决方案可以是:-
什么都不做(即利用sqlite的灵活性)
你可以使用cast,例如。
CAST(mycolumn AS TEXT)
(如下所示)创建新表以替换旧表。
解释。
对于sqlite,可以更改的内容有限制。简而言之,不能更改列。alter只允许您重命名表或添加列。依据:-
sqlite-alter表所理解的sql
但是,作为rowid列别名的列除外
定义为
?? INTEGER PRIMARY KEY
或者?? INTEGER PRIMARY KEY AUTOINCREMENT
或者?? INTEGER ... PRIMARY KEY(??)
(哪里??表示有效的列名)可以在任何类型的列中存储任何类型的值。e、 g.考虑以下情况(其中存储整数、实数、文本、最终成为文本的日期和blob):-
结果是:-
因此,是否需要更改列类型?
如果上述条件不充分,那么您唯一的选择就是使用新的列定义创建一个新表,如果需要,从原始表填充它,然后用新表替换原始表(a)drop original和b)rename new或a)rename original,b)rename new和c)drop original)
e、 g.:-
结果是:-
cig3rfwq2#
我认为sql查询语句是错误的,请尝试
使用列名而不是id。。。。
希望这有帮助。。。。
编辑: