2011-08-08 122 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

相关问题