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

26 浏览
0 Comments

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

我想将从网络服务获取的40000条记录插入到我的iPad应用的SQLite数据库中。我编写了以下代码,但它需要大约20分钟,有没有更快的方法?\n

- (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(@"成功的数量为-> %i",success);
            if (success == SQLITE_ERROR)
                NSLog(@"插入数据库时出错");
        }
        else
            NSLog(@"错误 %@ 错误!!!",querySQL);
        sqlite3_finalize(compiledStatement);
    }
    sqlite3_close(database);
    return nil;
}

0
0 Comments

在iPad中,将40000条记录快速插入SQLite数据库的问题是一个常见的挑战。对于我来说,调用BEGIN TRANSACTION来开始事务,然后加载大约20条插入语句,最后调用COMMIT TRANSACTION可以提高18倍的性能。这是一个很好的技巧!而对于缓存准备好的语句并没有太大帮助。

原因:

在向SQLite数据库中插入大量记录时,每次插入都会引起磁盘写入,而磁盘写入是相对较慢的操作。因此,每次插入记录都会导致性能下降。这就是为什么在插入大量记录时,性能会变得很慢的原因。

解决方法:

为了提高插入记录的性能,我们可以采用以下方法:

1. 使用事务:通过使用事务,可以将多次插入操作合并为一个事务,减少了磁盘写入的次数。在开始插入记录之前,调用BEGIN TRANSACTION来开始一个事务,在插入了一定数量的记录后,再调用COMMIT TRANSACTION来提交事务。这样可以显著提高性能。

示例代码:

BEGIN TRANSACTION;
INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);
INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);
...
COMMIT TRANSACTION;

2. 缓存准备好的语句:在插入大量记录时,可以事先准备好插入的SQL语句,并将其缓存起来。这样可以避免每次插入记录时都需要重新解析SQL语句的开销,提高性能。

示例代码:

// 准备SQL语句

let insertStatementString = "INSERT INTO table_name (column1, column2, ...) VALUES (?, ?)"

var insertStatement: OpaquePointer? = nil

// 缓存准备好的语句

if sqlite3_prepare_v2(db, insertStatementString, -1, &insertStatement, nil) == SQLITE_OK {

// 执行插入操作

for record in records {

sqlite3_bind_text(insertStatement, 1, record.value1, -1, SQLITE_TRANSIENT)

sqlite3_bind_text(insertStatement, 2, record.value2, -1, SQLITE_TRANSIENT)

...

sqlite3_step(insertStatement)

sqlite3_reset(insertStatement)

}

}

// 释放准备好的语句

sqlite3_finalize(insertStatement)

通过以上两种方法的组合使用,可以显著提高向SQLite数据库中插入大量记录的性能。希望这些技巧对解决在iPad中快速插入40000条记录的问题有所帮助。

0
0 Comments

问题:如何在iPad中快速向sqlite数据库中插入40000条记录?

原因:插入速度较慢的原因可能是由于以下三个方面:

1. 每次循环都调用了sqlite3_open函数,可以将其移出循环外部。

2. 没有使用事务来包裹插入操作,可以在插入循环之前开始事务,在循环结束后提交事务。

3. 代码中的formatStringQueryInsertWithTable函数没有完全使用预编译语句,缺少了sqlite3_bind_XYZ函数的调用。

解决方法:可以参考这篇文章,其中给出了解决方法的示例代码。示例代码使用了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!\n");
    }
    sqlite3_reset(stmt);
}
sqlite3_exec(mDb, "COMMIT TRANSACTION", NULL, NULL, &errorMessage);
sqlite3_finalize(stmt);

以上就是如何在iPad中快速向sqlite数据库中插入40000条记录的原因以及解决方法。

0