我目前正在开发一个使用 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 语句时,不会返回任何记录。
为什么会发生这种情况?