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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何快速将40000条记录插入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;
}
答案

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

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

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

char* errorMessage;
sqlite3_exec(mDb, "BEGIN TRANSACTION", NULL, NULL, &errorMessage);
char buffer[] = "INSERT INTO example VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)";
sqlite3_stmt* stmt;
sqlite3_prepare_v2(mDb, buffer, strlen(buffer), &stmt, NULL);
for (unsigned i = 0; i < mVal; i++) {
    std::string id = getID();
    sqlite3_bind_text(stmt, 1, id.c_str(), id.size(), SQLITE_STATIC);
    sqlite3_bind_double(stmt, 2, getDouble());
    sqlite3_bind_double(stmt, 3, getDouble());
    sqlite3_bind_double(stmt, 4, getDouble());
    sqlite3_bind_int(stmt, 5, getInt());
    sqlite3_bind_int(stmt, 6, getInt());
    sqlite3_bind_int(stmt, 7, getInt());
    if (sqlite3_step(stmt) != SQLITE_DONE) {
        printf("Commit Failed!
");
    }
    sqlite3_reset(stmt);
}
sqlite3_exec(mDb, "COMMIT TRANSACTION", NULL, NULL, &errorMessage);
sqlite3_finalize(stmt);
另一答案

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

以上是关于如何快速将40000条记录插入iPad中的sqlite数据库的主要内容,如果未能解决你的问题,请参考以下文章

java - 如何使用rmi在java中的mysql(jdbc)中插入一条记录? [关闭]

将MYSQL某一数据库中的多条记录批量插入到另一MYSQL数据库时,记录不存在则插入,存在则更新

sqli-labs学习

MySQL如何复制表中的一条记录并插入

MySql || 快速创建100w条记录

如何将子记录的插入限制为 N 条记录?