私は現在、リモートデータソースを使用してSQLiteデータベースにローカルでデータを永続化するAIRとFlexを使用するプロジェクトに取り組んでいます。現在、軽減しようとしているコピーアンドペーストコードがたくさんあるので、渡されるいくつかの一般的なクエリとSQLStatement値を作成するタイプを含むDAOパターンをすでに使用しているので、コードベースを単純化することさえ考えましたもっと。
アダプタパターンを適用して、可能なデータベース操作の範囲を広げました([saveOrUpdate、find、findAll、remove] => [selectSingle、selectMultiple、insert、updateSingle、updateMultiple、deleteSingle、deleteMultiple])。また、ストラテジーパターンをステートメントランナーの2つの側面に適用しました。selectMultiple関数に対して最初に返される集約型の種類(レコードの配列またはレコードのArrayCollectionのいずれか)。2回目は、履歴レコード(ChangeObjects)を作成するか作成しないかです。
これらのパターンを適用し、リファクタリングされたコードをテストした後、既存のSQLiteデータベースで完全に機能しました。リモートデータソースとの互換性をテストすることを怠りました。これは、そのプロセスでも保存メカニズムが使用されるためです。コードをリファクタリングして単純化し、開発サイクルの終わりに近づいた後、ダウンロードをテストしました。
sqlite3によると、実際にはデータが含まれていなかったにもかかわらず、SQLiteデータベースからデータを読み取ります。
これに関連するコードを示します。
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();
};
}
}
ロガーは、さまざまなデータベースレコードが挿入されたことを読み取り、上記のラムダのブレークポイントで停止すると、「オブジェクト」はすべて適切な値になります。sqlite3でSelectステートメントを実行すると、レコードが返されることはありません。
なぜこれが起こるのでしょうか?