Adobe Air SQLEvent.COMMIT,数据库在调度时仍然被锁定

时间:2013-09-19 16:44:57

标签: actionscript-3 flash sqlite air

我的数据库是在异步模式下打开的,这里是我试图通过提交插入一些信息的部分,在完成这项工作时没有其他事情发生。

conn.addEventListener(SQLEvent.COMMIT, commitHandler);
conn.begin();
for (var i:int = 0; i < someData.length; i++)
{
saveStmt = new SQLStatement();
saveStmt.sqlConnection = conn;
saveStmt.text = sql;
saveStmt.parameters["@some_ID"] = someData[i].id;
saveStmt.parameters["@some_title"] = someData[i].title;
saveStmt.execute();
}
conn.commit();
//here is commit handler
private function commitHandler(e:SQLEvent):void 
{
saveStmt = null;
conn.removeEventListener(SQLEvent.COMMIT, commitHandler);
conn.close(); //this gives error: Database file is currently locked
}

我在 conn.close(); 上收到错误,因为“数据库文件当前已被锁定”无法完成

来自Adobe的帮助: SQLEvent.COMMIT常量定义commit事件对象的type属性的值。当SQLConnection.commit()方法调用成功完成时,将调度此类事件。

系统可能出现什么问题?奇怪的是,这个错误不是永久性的,有时会出现(在其他情况下,一切都没有问题,数据库正在成功关闭),我正在使用 conn.addEventListener(SQLErrorEvent.ERROR,errorHandler)捕获此错误; < / strong>,没有出现其他类型的错误,仅在上面描述。

以上错误发生在Flash Pro的模拟器和设备上(在Nexus 7平板电脑上没有问题,并且在三星Galaxy s3上使用它们),我使用的是Adobe Air 3.8 for Android,同样适用于3.7和3.6。< / p>

1 个答案:

答案 0 :(得分:0)

我认为这可能与交易规模有关。我试图用有限的数据集重现这一点,但没有任何问题。

我建议使用SQLConnection.close()callLater()延迟Timer来电。

同时检查SQLConnection.inTransactionSQLStatement.executing的值,这些可能表示锁定仍然有效。