【问题标题】:Adobe Air SQLEvent.COMMIT, database is still locked when dispatchedAdobe Air SQLEvent.COMMIT,派发时数据库仍处于锁定状态
【发布时间】:2013-09-19 16:44:56
【问题描述】:

我的数据库是在异步模式下打开的,这是我尝试通过提交在其中插入一些信息的部分,在执行此工作时没有发生任何其他事情。

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(); 上遇到错误,由于“数据库文件当前已锁定”

,它无法完成

来自 Adob​​e 的帮助:SQLEvent.COMMIT 常量定义了提交事件对象的 type 属性值。此类事件在 SQLConnection.commit() 方法调用成功完成时调度。

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

上面的错误发生在 Flash Pro 的模拟器和设备上(在 Nexus 7 平板电脑上没有问题,在三星 Galaxy s3 上没有问题),我正在使用适用于 Android 的 Adob​​e Air 3.8,3.7 和 3.6 也会发生同样的情况。

【问题讨论】:

    标签: actionscript-3 flash sqlite air


    【解决方案1】:

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

    我建议使用callLater()Timer 延迟SQLConnection.close() 通话。

    还要检查SQLConnection.inTransactionSQLStatement.executing 的值,这些值可能表明锁仍然处于活动状态。

    【讨论】:

    • 我检查过,你是对的,需要额外的计时器来检查交易是否真的完成,在大数据上,我认为这可能是必要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多