我有一个我一直在研究的flex / air应用程序,它使用在初始应用程序启动时创建的本地sqlite数据库。
我已经为应用程序添加了一些功能,在这个过程中我必须向其中一个数据库表添加一个新字段。我的问题是如何让应用程序创建一个位于已存在的表中的新字段?
这是创建表格的行
stmt.text = "CREATE TABLE IF NOT EXISTS tbl_status ("+"status_id INTEGER PRIMARY KEY AUTOINCREMENT,"+" status_status TEXT)";
现在我想添加一个status_default字段。
谢谢!
谢谢 - MPelletier
我添加了您提供的代码并确实添加了该字段,但现在下次重新启动应用时出现错误 - “status_default”已经存在。
那么我怎样才能在你提供的那一行添加某种IF NOT EXISTS语句呢?
答案 0 :(得分:31)
ALTER TABLE tbl_status ADD COLUMN status_default TEXT;
http://www.sqlite.org/lang_altertable.html
话虽如此,在SQLite中添加列是有限的。您无法在表格的最后一列之后的任何位置添加列。
至于检查列是否已存在,PRAGMA table_info(tbl_status);
将返回一个列出表格各列的表格。
ADD ON:
我一直在使用数据库设计策略,这使我可以区分需要哪些修改。为此,您需要一个新表(称为DBInfo
),其中包含一个字段(整数,称之为SchemaVersion
)。或者,SQLite中还有一个名为user_version
的内部值,可以使用PRAGMA
命令设置。您的代码可以在程序启动时检查架构版本号并相应地应用更改,一次一个版本。
假设一个名为UpdateDBSchema()
的函数。此函数将检查您的数据库模式版本,处理DBInfo不存在,并确定数据库是否为版本0.此函数的其余部分可能只是一个具有不同版本的大型交换机,嵌套在循环中(或其他可用结构)到你选择的平台)。
因此,对于第一个版本,请使用UpgradeDBVersion0To1()
函数创建此新表(DBInfo
),添加status_default
字段,并将SchemaVersion
设置为1在你的代码中,添加一个指示最新模式版本的常量,比如LATEST_DB_VERSION
,并将其设置为1.这样,你的代码和数据库都有一个模式版本,你知道你需要同步它们如果他们不平等。
如果您需要对架构进行其他更改,请将LATEST_DB_VERSION
常量设置为2并创建一个新的UpgradeDBVersion1To2()
函数,以执行所需的更改。
这样,您的程序可以轻松移植,可以连接并升级旧数据库等。
答案 1 :(得分:3)
我知道这是一个老问题......但是。
我在Adobe AIR的SQLite实现中遇到了这个精确的问题。我认为可以使用PRAGMA命令来解决,但由于adobe air的实现不支持PRAGMA命令,我们需要一个替代方案。
我所做的,我认为在这里分享是值得的,是:
var sql:SQLStatement = new SQLStatement();
sql.sqlConnection = pp_db.dbConn;
sql.text = "SELECT NewField FROM TheTable";
sql.addEventListener(SQLEvent.RESULT, function(evt:SQLEvent):void {
});
sql.addEventListener(SQLErrorEvent.ERROR, function(err:SQLErrorEvent):void {
var sql:SQLStatement = new SQLStatement();
sql.sqlConnection = pp_db.dbConn;
sql.text = "ALTER TABLE TheTable ADD COLUMN NewField NUMERIC;";
sql.execute();
sql.addEventListener(SQLEvent.RESULT, function (evt:SQLEvent):void {
});
});
sql.execute();
希望它有所帮助。
答案 2 :(得分:0)
我使用这个问题的答案解决了类似的问题: ALTER TABLE ADD COLUMN IF NOT EXISTS in SQLite
使用内置的user_version参数来跟踪您的更新。您可以使用以下方式进行设置:
PRAGMA user_version = 1
并使用
检索它PRAGMA user_version
所以基本上检索user_version(默认为0),检查它是否为0.如果是,请执行更新并将其设置为1.如果将来有更多更新,请检查它是否为1,执行更新并设置它到0.等等......
答案 3 :(得分:0)
在某些情况下,我执行命令并获取“重复列”的异常。只是一个快速的解决方案,而不是完美的。