Нужно оптимизировать загрузку SQLite в TableView - PullRequest
2 голосов
/ 08 августа 2011

У меня есть база данных SQLite с 5000 строками, которая загружается в табличное представление.

Загрузка таблицы занимает около 5-10 секунд (что очень долго для iPhone). Есть ли способ, которым я могу загружать клетки меньшими партиями или что-то еще, чтобы ускорить это? Кроме того, когда я возвращаюсь в иерархию, а затем возвращаюсь к этому представлению, оно должно перезагружаться снова и снова. Могу ли я вместо этого кешировать это?

- (void)viewDidLoad
{
    [super viewDidLoad];
    [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];
    [self dismissHUD];
    NSLog(@"done");    
}

В моем классе базы данных:

-(NSMutableArray *) getICD9DiseaseCodes
{
    sqlite3 *database = CodesDatabase();

    NSMutableArray *icd9DiseaseCodes = [[[NSMutableArray alloc] init] autorelease];

    NSString *nsquery = [[NSString alloc] initWithFormat:@"SELECT code, title, description FROM icd9_disease_codes ORDER BY code"];
    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];
            [icd9DiseaseCodes addObject:code];
            //            NSLog(@"Code: %@ Short Description: %@ Long Description: %@", hcpcsCode.code, hcpcsCode.name, hcpcsCode.description);
            [code release];
        }
        sqlite3_finalize(statement);
    }
    return icd9DiseaseCodes;
}

Ответы [ 2 ]

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

Мой первый вопрос: почему вы используете SQLite напрямую, а не Core Data? Core Data бесплатно выполнит частичные выборки из хранилища данных без дополнительного кода с вашей стороны.

Если вы хотите сделать то же самое вручную с SQLite напрямую, то вам нужен тяжелый код. Вам нужно будет использовать LIMIT и OFFSET в своих запросах SQL для извлечения частичных данных и расширять свой API, чтобы получать только меньшие подмножества за раз.

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

Вы рассматривали или изучали CoreData? CoreData оптимизирован для больших наборов записей.

Спасибо. Джеймс

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