2011-12-15 5 views
0

私のiPhoneアプリケーションは、多くの異なるモデルオブジェクト(FYI、私はFMDBを使用しています)によってアクセスされる単一のsqliteデータベースを持っています。私はいくつかのヘルパーメソッドを使用してデータベースに問い合わせ、結果からオブジェクトを作成しています。私は、例えば(ヘルパーメソッドのコードのほとんどはモデルオブジェクトにモデルオブジェクトから複製されていることを発見しています:MyObjectA & MyObjectBこれらの同一の機能を持って、両方:iPhoneアプリケーションでsqliteデータベースにアクセスする複数のオブジェクトを管理するにはどうすればよいですか?

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

MyObjectA & MyObjectBの両方が完全に異なる目的を持って、彼らこれらのヘルパーを利用して、目的を果たすために Booオブジェクトを取得するには、& Booオブジェクトを取得する必要があります。これらのヘルパーメソッドを複数のコードを複製せずに使用できるようにするにはどうすればよいですか?誰かがいくつかのオプションを提供できますか?

+0

なぜ単にFMDatabaseクラスをオーバーライドしていませんか? –

答えて

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]) { 
     … 
    } }]; 
関連する問題