0

私のiPhoneアプリには、多くの異なるモデルオブジェクトからアクセスされる単一のsqliteデータベースがあります(参考までに、私はFMDBを使用しています)。データベースにクエリを実行し、結果からオブジェクトを作成するために、いくつかのヘルパー メソッドを使用しています。ほとんどのヘルパー メソッド コードがモデル オブジェクトからモデル オブジェクトに複製されていることがわかりました (例: MyObjectA&MyObjectB両方にこれらの同一の機能があります:

-(Foo *)getFooForKey:(NSInteger)key;
-(NSArray *)getBarsForFoo:(Foo *)foo;
-(Boo *)getBooForKey:(NSInteger)key;

MyObjectA&MyObjectBは両方ともまったく異なる目的を持っていますが、これらのヘルパーに依存して、目的を果たすために Foo、Bar、および Boo オブジェクトを取得します。

大量のコードを複製せずにこれらのヘルパー メソッドを利用できるようにする最善の方法は何ですか? シングルトンは使いたくない。誰かがいくつかのオプションを提供できますか?

4

1 に答える 1

0

データベース ラッパーの機能を拡張したい場合は、単に FMDatabase をオーバーライドするか、カテゴリを作成します。

ただし、複数のスレッドで FMDatabase を共有しないでください (データベース ラッパーの共有を避けるようにしてください)。オブジェクトごとに FMDatabase オブジェクトを作成するだけで問題ありません。スレッドセーフな方法を使用していることを確認してください。

(以下の行は FMDB ドキュメントhttps://github.com/ccgus/fmdbから引用されています)

そのため、単一の FMDatabase オブジェクトをインスタンス化して、複数のスレッドで使用しないでください。

代わりに、FMDatabaseQueue を使用してください。それはあなたの友達であり、助けるためにここにいます。使用方法は次のとおりです。

まず、キューを作成します。

FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath]; 

[queue inDatabase:^(FMDatabase *db) {
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]];
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]];
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];

    FMResultSet *rs = [db executeQuery:@"select * from foo"];
    while ([rs next]) {
        …
    } }];
于 2012-04-22T19:07:08.697 に答える