android-在运行时动态更改sqlite数据库中的列类型

kd3sttzy  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(371)

我有一个应用程序,在运行时在页面加载时检测特定列的类型。请参考以下代码:

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”,但仍然得到相同的错误。
请检查这是否是动态更改类型的正确方法。
如果有人有解决办法,请回复。
提前谢谢。

ggazkfy8

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):-

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)drop original和b)rename new或a)rename original,b)rename new和c)drop original)
e、 g.:-

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;

结果是:-

cig3rfwq

cig3rfwq2#

我认为sql查询语句是错误的,请尝试

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

使用列名而不是id。。。。
希望这有帮助。。。。
编辑:

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

相关问题