2011-08-08 36 views
0

有沒有辦法加速SQLite獲取? 我正在從我的SQLite數據庫中獲取數據到一個加載我的tableView的數組中。有沒有辦法加快SQLite獲取?

它正在圍繞10-20秒來填充所述陣列。有沒有更快的方法來做到這一點或什麼?也許只能一次加載每個單元格,至少用戶在加載其他單元格時看到一些單元格?

這裏是我的ViewController代碼: 代碼:

-(void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [NSThread detachNewThreadSelector:@selector(myThread:) toTarget:self withObject:nil]; 
} 
-(void) myThread:(id) obj { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSMutableArray *array = [[Database sharedDatabase] getICD9DiseaseCodes]; 
    [self performSelectorOnMainThread:@selector(dataDoneLoading:) withObject:array waitUntilDone:NO]; 
    [pool release];  
} 

-(void) dataDoneLoading:(id) obj { 
    NSMutableArray *array = (NSMutableArray *) obj; 
    self.codeAray = array; 
    [self.myTableView reloadData]; 
} 

下面是實際的代碼獲取: 代碼:

-(NSMutableArray *) getICD9ProcedureCodes 
{ 
    sqlite3 *database = CodesDatabase(); 
    NSMutableArray *icd9ProcedureCodes = [[[NSMutableArray alloc] init] autorelease]; 

    NSString *nsquery = [[NSString alloc] initWithFormat:@"SELECT code, title, description FROM icd9_procedure_codes"]; 
    const char *query = [nsquery UTF8String]; 
    [nsquery release]; 

    sqlite3_stmt *statement; 
    int prepareCode = (sqlite3_prepare_v2(database, query, -1, &statement, NULL)); 
    if(prepareCode == SQLITE_OK) { 
     while (sqlite3_step(statement) == SQLITE_ROW) 
     { 
      ICD9DiseaseCodes *code = [[ICD9DiseaseCodes alloc] init]; 
      code.code = [NSString stringWithCString:(char *)sqlite3_column_text(statement, 0) encoding:NSUTF8StringEncoding]; 
      code.name = [NSString stringWithCString:(char *)sqlite3_column_text(statement, 1) encoding:NSUTF8StringEncoding]; 
      code.description = [NSString stringWithCString:(char *)sqlite3_column_text(statement, 2) encoding:NSUTF8StringEncoding]; 
      [icd9ProcedureCodes addObject:code]; 
      [code release]; 
     } 
     sqlite3_finalize(statement); 
    } 
    return icd9ProcedureCodes; 
} 
+0

有多少行是在表中?你可能要考慮使用[NSFetchedResultsController](http://maniacdev.com/2010/01/core-data-nsfetchedresultscontroller/)。 –

+0

大約有5000行。 – Jon

+0

NSFetchedResultsController將處理只加載你需要的行。您將需要轉換爲使用CoreData來訪問sqlite數據庫。 –

回答

2

你一定要只加載這些行,你需要。使用SQL LIMIT和OFFSET選項僅加載所需內容。

我不知道不加思索如果一次讀取單行將是速度不夠快,但它是值得一試。例如:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *queryString = [NSString stringWithFormat: @"SELECT code, title, description FROM icd9_procedure_codes ORDER BY ROWID LIMIT 1 OFFSET %d", indexPath.row]; 

    // perform your database SELECT operation here 

    // set up your UITableViewCell with whatever results you want to display 
    cell.textLabel.text = code.name; 
} 

您還應該確保在cellForRowAtIndexPath中重用UITableViewCells。

+0

嘿埃裏克,所以你是說在我的'執行的代碼,多數民衆贊成 - (NSMutableArray的*)getICD9ProcedureCodes'方法嗎?這東西是在它自己的NSObject類,雖然 – Jon

+0

我只是說,你應該只需要一次讀取一個記錄,而不是一次。我認爲它可能會很快顯示錶格。我從代碼中無法確切知道你是否真的需要一次在內存中的所有記錄。例如,如果用戶點擊與indexPath.row = 40的UITableViewCell,你永遠可以讀取源碼與「選擇代碼,標題,描述從icd9_procedure_codes ORDER BY ROWID LIMIT 1 OFFSET 40」這個紀錄。 (或者,您可以繼承UITableViewCell並附加一個ICD9DiseaseCodes對象)。 – EricS

相關問題