В моем приложении мне нужно ВСТАВИТЬ несколько раз некоторую запись. Каждый раз, когда я использую эту функцию: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];
}
Что мне сделать, чтобы улучшить это время? Например, избегая открывать базу данных каждый раз? В этом случае как?
Заранее спасибо
1. Чтобы избежать зависания пользовательского интерфейса, вы можете выполнить операцию базы данных в другом потоке. 2. Это приведение не нужно 'NSString * insertSQL = [NSString stringWithFormat: @"% @ ", stringa];' 3. Что вы делаете в '[self getWritableDBPath];'? –
Tx. Я просто редактирую функцию getWritableDBPath. И если я удалю бросок, это не улучшит время. – doxsi
Я не сказал, что если вы удалите этот бросок, он будет быстрее. Я просто хочу сообщить, что это не нужно, не нужно снова преобразовывать строку в строку. Также проверьте с помощью функции sqlite3_exec. –