android - 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',但仍然遇到同样的错误。
请检查这是否是动态更改类型的正确方法。
如果有人对此有解决方案,请回复。
提前致谢。
解决方案
简而言之,解决方案可能是:-
- 什么都不做(即利用 SQLite 的灵活性)
- 您可以使用 CAST,例如
CAST(mycolumn AS TEXT)
(如下所示)
- 您可以使用 CAST,例如
- 创建一个新表来替换旧表。
解释。
使用 SQLite,可以更改的内容存在限制。简而言之,您不能更改列。Alter 只允许您重命名表或添加列。按照 :-
但是,除了作为rowid列别名的列
- 一个用 or 定义的or
?? 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;
结果是:-
因此,是否需要更改列类型?
如果以上还不够,那么您唯一的选择是使用新列定义创建一个新表,如果需要,从原始表中填充它,然后用新表替换原始表(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;
结果是:-
推荐阅读
- c# - 从 FileStream 读取 JSON
- excel - 如何快速复制和粘贴/拖动公式到多行和多列
- spring - 春天 i18N 视频
- oracle - Oracle PL/SQL 似乎忽略了我的函数的 WHERE 子句
- ruby-on-rails - 在 Ruby on rails 中注释掉一个 '=begin'
- gridview - 如何在 DevExpress GridView 中获取新行的值?
- mongodb - 如何在不使用展开的情况下在子文档中添加计算字段?
- google-apps-script - Google Apps 脚本删除云端硬盘文件导致错误
- sql - 如何在 BigQuery 中从 NoSQL 数据库中查询键值对
- elasticsearch - 在 grafana 上将多个容器名称显示为单独的标签