2010-11-02 61 views
1

我正在訪問近30,000個單詞並在表中顯示。這些單詞在一個sqlite文件中。所以需要很長時間(15秒)來運行查詢並將該單詞加載到表中。顯然,該應用程序在啓動時等待15秒。iPhone快速sqlite查詢

我該如何解決這個問題?

NSLog(@"Query start"); 


    CFTimeInterval startTime = CFAbsoluteTimeGetCurrent(); 

FMResultSet *rs = [db executeQuery:@"select * from words order by no ASC "]; 
while ([rs next]) { 
    Word *word = [[Word alloc] initWithID:[rs intForColumn:@"id"] 
             no:[rs stringForColumn:@"no"] 
             en:[rs stringForColumn:@"en"]]; 
    [words addObject: word]; 
} 
[rs close]; 
[db close]; 

CFTimeInterval endTime = CFAbsoluteTimeGetCurrent(); 
float deltaTimeInSeconds = endTime - startTime; 
NSLog(@"Time spent for query: %f seconds", deltaTimeInSeconds); 

注:原始表格未排序。它是字典的單詞列表,所以何時顯示,它必須按字母順序排列在表格視圖中。這就是爲什麼,我需要加載所有的單詞。後臺線程可能是一個更好的主意,從sqlite中獲取數據時填充數據。 sqlite是否支持這個?用回調方法提取數據。例如在sqlite查詢中,對於獲取的每1000條記錄,我將更新我的表。我不太確定如何做到這一點,如果你知道PLZ給我一些提示。

+1

表索引? – 2010-11-02 12:28:00

+1

我不這麼認爲。這是一個sqlite語言表,用於在Java中創建的字典(數據輸入在桌面上完成)。 – karim 2010-11-02 13:13:16

+1

索引提高了性能。但並不多。它將加載時間從15秒降低到6/7秒。 – karim 2011-04-02 18:34:38

回答

3

使用LIMITOFFSET同時獲取數據塊。另外,讓UITableView驅動讀取過程。當它觸發tableView:cellForRowAtIndexPath:並且所討論的行不可用時,從SQLite中提取並緩存包含該行的行塊。您也可以在後臺獲取後臺線程或事件循環,以便在用戶滾動表格時最小化延遲。

1

我建議兩兩件事:

首先:你需要在同一時間加載在內存中的所有對象30000?如果你不需要它,只要你需要它們就可以加載你要在表格中顯示的對象。您可以在查詢中使用limit子句來加載只需要顯示的小部分數據。

第二:您可以嘗試查看是否在no字段幫助下創建索引。儘管很大一部分時間很難提高性能,但iOS會花費創建Word對象並將它們放入words陣列中。

+0

plz請參閱注意: – karim 2010-11-02 13:18:00

+1

然後嘗試在該列上創建索引。 – 2010-11-02 13:31:23

+1

我還關心創建的Word對象。我想過使用並行數組的字符串。但這會使分類和對象管理複雜化。 – karim 2010-11-02 22:48:21

1

您可能還想考慮切換到Core Data和NSFetchedResultsController,而不是直接使用Sqlite。

核心數據的一大優點就是它在緩存和延遲加載對象方面的優勢。

Core Data vs Sqlite and performance

+0

使用核心日期時,sqlite字段會給出一些不友好的名稱。而sqlite數據庫是在其他地方使用java和其他sqlite瀏覽器工具創建的。所以我需要使用sqlite。 – karim 2010-11-02 13:19:27