2015-09-19 8 views
1

В моем приложении мне нужно ВСТАВИТЬ несколько раз некоторую запись. Каждый раз, когда я использую эту функцию:iphone - улучшите INSERT в sqlite

- (int) insertFunction:(NSString *)stringa{ 
    NSDate * start = [NSDate date]; 

    sqlite3_stmt *statement; 
    NSString *file = [self getWritableDBPath]; 

    if (sqlite3_open([file UTF8String] , &_database) == SQLITE_OK) 
    { 
     NSString *insertSQL = [NSString stringWithFormat:@"%@",stringa]; 

     const char *insert_stmt = [insertSQL UTF8String]; 

     sqlite3_prepare_v2(_database, insert_stmt, -1, &statement, NULL); 

     if (sqlite3_step(statement) == SQLITE_DONE) 
     { 
      //NSLog(@"Contact added"); 

     } else { 
      NSLog(@"Failed to add contact"); 
     } 

     sqlite3_finalize(statement); 
    } 
    sqlite3_close(_database); 
    int row_id = (int)sqlite3_last_insert_rowid(_database); 

    NSLog(@"SINGLE INSERT took: %f", -[start timeIntervalSinceNow]); 

    return row_id; 

} 

, что заняло около 0,020 секунды, и сделать мое приложение frezing около 5 секунды.

-EDIT- Мой getWritableDBPath является:

- (NSString *) getWritableDBPath { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
    NSString *documentsDir = [paths objectAtIndex:0]; 
    return [documentsDir stringByAppendingPathComponent:DATABASE_NAME]; 
} 

Что мне сделать, чтобы улучшить это время? Например, избегая открывать базу данных каждый раз? В этом случае как?

Заранее спасибо

+0

1. Чтобы избежать зависания пользовательского интерфейса, вы можете выполнить операцию базы данных в другом потоке. 2. Это приведение не нужно 'NSString * insertSQL = [NSString stringWithFormat: @"% @ ", stringa];' 3. Что вы делаете в '[self getWritableDBPath];'? –

+0

Tx. Я просто редактирую функцию getWritableDBPath. И если я удалю бросок, это не улучшит время. – doxsi

+0

Я не сказал, что если вы удалите этот бросок, он будет быстрее. Я просто хочу сообщить, что это не нужно, не нужно снова преобразовывать строку в строку. Также проверьте с помощью функции sqlite3_exec. –

ответ

0

Вы можете посмотреть на closeDatabase вызова, если версия SQLite вы используете достаточно новый он, вероятно, разместили свои операции записи в WAL и будет совершать их в основной база данных. Хотя 5 секунд кажется довольно медленным.

Для получения других комментариев о том, чтобы оставить базу данных открытой, просто вызовите только один раз и удерживайте дескриптор sqlite3 * в переменной класса, а затем закройте его, когда класс будет удален, вы увидите гораздо лучше представление.

+0

Tx. Как coull Попробуйте заменить оператор close? и Как coud Я вызываю только один раз базу данных open/close? – doxsi