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

时间:2018-07-03 03:51:28

标签: android mysql android-sqlite

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

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

注意:我也用'ALTER'代替了'MODIFY',但仍然出现相同的错误。

请检查这是否是动态更改类型的正确方法。

如果有人对此有解决方案,请回复。

谢谢。

2 个答案:

答案 0 :(得分:1)

简而言之,解决方案可能是:-

  1. 不执行任何操作(即利用SQLite的灵活性)
    1. 您可以利用CAST,例如CAST(mycolumn AS TEXT) (如下所述)
  2. 创建新表以替换旧表

说明。

使用SQLite可以更改的内容受到限制。简而言之,您无法更改列。 Alter仅允许您重命名表或添加列。按照:-

enter image description here

SQL As Understood By SQLite - ALTER TABLE

但是,除了作为 rowid

的别名的列之外
  • 使用?? 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)删除原始文件,然后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;

结果是:-

enter image description here

答案 1 :(得分: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);"