2009-10-08 30 views
0

我遇到了一些性能問題加載從sqlite3的表約60圖像如下表所示:提高iPhone的性能 - 從sqlite3的數據庫加載圖像

select rowid, thumbnail 
from my_table 
where category_id = 4 

我有CATEGORY_ID指數,但它需要大約2.5秒鐘可以加載一張包含170張70x70 PNG圖像的表格。

在我的代碼,我創建一個NSMutableArray代表每一行的對象,像這樣:

Item* item = [[Item alloc] init]; 
    item.rowid = sqlite3_column_int(statement, 0); 

    int thumbnailLength = sqlite3_column_bytes(statement, 1); 
    NSData* data = [NSData dataWithBytes:sqlite3_column_blob(statement, 1) length:thumbnailLength]; 
    item.thumbnail = [[UIImage imageWithData:data] autorelease]; 

    [result addObject: item] 

的iPhoto可以與幾乎沒有可見的加載時間加載一張專輯。是否有一些我錯過的可以提升性能的SQLite3技巧?

回答

1

我敢打賭,照片應用程序只加載那些在屏幕上可見在給定時間的縮略圖,當你向下滾動在您的相冊列表檢索等。在3.x,NSFetchedResultsController和它的setFetchBatchSize:方法中使用Core Data很容易。手動實現這個使用原始SQLite將需要更多的代碼,但它仍然是可行的。這種方法具有加載時間和內存優勢。

在我的SQLite數據訪問,我沒有注意到一個顯著加載時間從SQLite數據庫上拉至17張150×50的PNG圖片,所以有可能別的東西放慢你失望。您也可以嘗試在數據加載方法上運行Instruments和Shark,以查看SQLite是否真的成爲您的瓶頸。我曾經有過一個我認爲是的例子,但事實證明,我有一個低效率的字符串處理例程,這實際上減慢了我從SQLite數據創建對象的速度。

+0

我只想添加一點這個迴應。你也應該考慮提取你需要的東西。如果你使用的是表格視圖,比如說,你可以一次獲取一個東西(或者分組和緩存)。如果您使用自定義控件,請考慮讓它遵循類似的模式,只需獲取您所展示的內容即可。 SQLite將接受如下內容:SELECT * from myTable limit 1 offset 10; 這會讓你只是10日的記錄,例如。哦,但不要使用*,因爲這很俗氣。 – mousebird 2009-10-08 15:20:50