iphone - 将INSERT改进为sqlite

时间:2015-09-19 10:33:36

标签: ios 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秒,让我的应用程序大约5秒钟。

-EDIT-我的getWritableDBPath是:

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

我可以做些什么来改善这段时间?例如,每次都避免打开数据库?在这种情况下如何?

提前致谢

1 个答案:

答案 0 :(得分:0)

您可能希望查看closeDatabase调用,如果您使用的SQLite版本足够新,它可能会将您的写入放入WAL并将它们提交到主数据库中。虽然5秒看起来确实很慢。

关于让数据库保持打开状态的其他注释,只需调用open一次并保持一个类变量中的sqlite3 *句柄,然后在类被dealloc'ed时关闭它,你会看到更好的性能