Есть ли способ ускорить выборку SQLite? - PullRequest
0 голосов
/ 08 августа 2011

Есть ли способ ускорить выборку SQLite? Я получаю данные из базы данных SQLite в массив, который загружает мой tableView.

Заполнение массива занимает около 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;
}

1 Ответ

2 голосов
/ 08 августа 2011

Вы должны определенно загружать только те строки, которые вам нужны. Используйте параметры 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;
}

Вы также должны убедиться, что вы повторно используете UITableViewCells в cellForRowAtIndexPath.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...