将列添加到sqlite db如果不是EXISTS - flex / air sqlite?

时间:2010-04-10 19:54:37

标签: sqlite flex3 air field

我有一个我一直在研究的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语句呢?

4 个答案:

答案 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)

在某些情况下,我执行命令并获取“重复列”的异常。只是一个快速的解决方案,而不是完美的。