0

私は現在、リモートデータソースを使用して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ステートメントを実行すると、レコードが返されることはありません。

なぜこれが起こるのでしょうか?

4

1 に答える 1

0

SQLConnection 値で開いているトランザクションが原因であることが判明しました。チームプロジェクトが大好きです。SQLConnection トランザクションをコミットまたはロールバックしてください。

于 2012-12-18T20:39:20.087 に答える