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

标签 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:接近“MODIFY”:语法错误(代码1):,编译时:ALTER TABLE tblUsers MODIFY COLUMN用户ID文本

注意:我还将“MODIFY”替换为“ALTER”,但仍然遇到相同的错误。

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

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

提前致谢。

最佳答案

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

  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、一个 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

关于Android - 在运行时动态更改 SQLite 数据库中的列类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51146428/

相关文章:

android - 如何创建可滚动的布局

android - 安全漏洞访问控制 : Database in sqlite insert

mysql - Subsonic 3.0.0.3 与 MySQL 4template 无法正常工作

android - 限制sqlite表中行的显示计数

java - 如何使用适配器位置将数据从 firebase 检索到新 Activity

带有文本+图像的Android自定义GridLayout

php - 登录我的网站

mysql - 是否可以从 Ruby 调用 MySQL 存储过程?

Android 在 SQLite 数据库文件中获取 Sharedpreferences

java - SQLiteAssetHelper :Couldn't open database for writing (will try read-only)