如何快速将40000条记录插入iPad中的sqlite数据库

时间:2013-01-31 17:18:48

标签: ios objective-c performance ipad sqlite

我想在我的iPad应用程序中将从Web服务获取的40000条记录插入到sqlite数据库中。

我编写了以下代码,但大约需要20分钟,有更快的方法吗?

- (NSArray *)insertPriceSQLWithPrice:(Price *) price
{

SQLiteManager *dbInfo = [SQLiteManager sharedSQLiteManagerWithDataBaseName:@"codefuel_catalogo.sqlite"];


sqlite3 *database;

NSString *querySQL=[self formatStringQueryInsertWithTable:@"prices_list" andObject:price];


if(sqlite3_open([dbInfo.dataBasePath UTF8String], &database) == SQLITE_OK)
{
    sqlite3_stmt * compiledStatement;


    const char *query_stmt = [querySQL UTF8String];

    int result = sqlite3_prepare_v2(database, query_stmt, -1, &compiledStatement, NULL);

    if (result == SQLITE_OK)
    {
        int success = sqlite3_step(compiledStatement);

        NSLog(@"el numero de success es -> %i",success);
        if (success == SQLITE_ERROR)
            NSLog(@"Error al insertar en la base de datps");

    }
    else
        NSLog(@"Error %@ ERROR!!!!",querySQL);

    sqlite3_finalize(compiledStatement);
}

sqlite3_close(database);
return nil;
}

2 个答案:

答案 0 :(得分:22)

为了加快插入速度,您需要做三件事:

  • sqlite3_open的调用移到循环之外。目前,循环未显示,因此我认为它不在您的代码段之内
  • 添加BEGIN TRANSACTIONCOMMIT TRANSACTION 调用 - 您需要在插入循环之前开始事务,并在循环结束后立即结束。
  • formatStringQueryInsertWithTable真正参数化 - 目前您似乎没有充分使用预准备语句,因为尽管使用了sqlite3_prepare_v2,但您没有调用{{1}在你的代码中。

这是a nice post that shows you how to do all of the above。它是普通的C,但它可以作为Objective C程序的一部分正常工作。

sqlite3_bind_XYZ

答案 1 :(得分:5)

对我来说,调用BEGIN TRANSACTION然后加载大约20个插入,然后调用COMMIT TRANSACTION使性能提高18倍 - 很棒!缓存准备好的语句几乎没有帮助。