【问题标题】:Adobe AIR SQLResult listener reached, but no data in SQLite已到达 Adob​​e AIR SQLResult 侦听器,但 SQLite 中没有数据
【发布时间】:2012-12-17 18:09:49
【问题描述】:

我目前正在开发一个使用 AIR 和 Flex 的项目,该项目使用远程数据源将数据本地保存在 SQLite 数据库中。目前,我试图减轻很多复制和粘贴代码,所以由于我们已经使用了带有几个常见查询的 DAO 模式和一个创建 SQLStatement 值的类型,我想我甚至可以简化我们的代码库更多。

我应用了适配器模式以允许执行更广泛的可能的数据库操作([saveOrUpdate, find, findAll, remove] => [selectSingle, selectMultiple, insert, updateSingle, updateMultiple, deleteSingle, deleteMultiple])。我还将策略模式应用于语句运行器的两个方面:第一次为 selectMultiple 函数返回哪种聚合类型(记录数组或记录数组集合);第二次创建或不创建历史记录(ChangeObjects)。

在应用这些模式并测试一些重构代码后,它可以完美地与现有的 SQLite 数据库配合使用。我忽略了测试它与远程数据源的兼容性,因为在该过程中也使用了保存机制。在重构和简化我们的代码并接近开发周期结束后,我测试了下载。

它会从 SQLite 数据库中读取数据,尽管根据 sqlite3 实际上其中没有数据。

我会给出相关的代码。

public class BaseDaoAdaptee {
    private var returnStrategy: ReturnTypeStrategy;
    private var trackingStrategy: TrackingStrategy;
    private var creator: StatementCreator;

    public function insert(queryTitle: String, 
                           object: DaoAwareDTO,
                           parameters: Array, 
                           mutator: Function, 
                           handler: Function): void {
        var statement: SQLStatement;
        mutator = creator.validEmptyFunction(mutator);
        handler = creator.validFault(handler);
        statement = defaultStatement(queryTitle, parameters, handler);
        statement.addEventListener(SQLEvent.RESULT, 
            trackingStrategy.onInserted(object, mutator), false, 0, true);
        statement.execute();
    }
}

实现的 TrackingStrategy 代码:

public class TrackedStrategy 
    implements TrackingStrategy {
    public function onInserted(object: DaoAwareDTO, 
                               callback: Function): Function {
        return function (event: SQLEvent): void {
            var change: Change,
                id:Number = event.target.getResult().lastInsertRowID;
            creator.logger.debug((event.target as SQLStatement).itemClass + ' (id # ' + id + ') inserted');
            (object as Storeable).id = id;
            change = new Creation(object);
            change.register();
            callback();
        };
    }
}

记录器读取插入了各种数据库记录,当在上述 lambda 中的断点处停止时,“object”具有所有正确的值。在 sqlite3 中运行 Select 语句时,不会返回任何记录。

为什么会这样?

【问题讨论】:

    标签: actionscript-3 sqlite air


    【解决方案1】:

    原来 SQLConnection 值上的打开事务是原因。必须热爱团队项目。提交或回滚您的 SQLConnection 事务!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      • 2014-03-24
      • 2016-11-23
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      • 1970-01-01
      相关资源
      最近更新 更多