2011-12-15 49 views
0

我的iphone應用程序有一個單一的sqlite數據庫,可以通過許多不同的模型對象(FYI,我正在使用FMDB)訪問。我使用了幾個輔助方法來查詢數據庫並從結果中創建對象。我發現,大部分的輔助方法,代碼被從模型對象複製到模型對象(例如:MyObjectA & MyObjectB都有這些完全相同的功能:如何在iPhone應用程序中管理訪問sqlite數據庫的多個對象?

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

MyObjectA & MyObjectB都有完全不同的目的,但他們依靠這些助手來獲得Foo,Bar,& Boo對象以達到他們的目的

什麼是使這些幫助器方法可用而無需重複一堆代碼的最佳方法?我不想使用單例有人可以提供一些選擇嗎?

+0

爲什麼不簡單重寫FMDatabase類? – 2012-04-22 18:58:26

回答

0

只需重寫FMDatabase或創建一個類別,如果您想擴展數據庫包裝的功能。

但是,您不應該在多個線程上共享FMDatabase(儘量避免共享數據庫包裝)。只需爲每個對象創建一個FMDatabase對象,你就會很好。確保你會使用線程安全的方法。

所以不要實例化一個對象FMDatabase和整個 多個線程使用它(下面的線是從FMDB文檔https://github.com/ccgus/fmdb報價)。

而是使用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]) { 
     … 
    } }]; 
相關問題