0

我目前正在开发一个使用 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 中的断点处停止时,“对象”具有所有正确的值。在 sqlite3 中运行 Select 语句时,不会返回任何记录。

为什么会发生这种情况?

4

1 回答 1

0

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

于 2012-12-18T20:39:20.087 回答