Osc*_*VGG 7 sqlite performance objective-c ipad ios
我想在我的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;
}
Run Code Online (Sandbox Code Playgroud)
das*_*ght 23
为了加快插入速度,您需要做三件事:
sqlite3_open循环外的调用.目前,循环未显示,因此我假设它在您的代码段之外BEGIN TRANSACTION和COMMIT TRANSACTION调用 - 您需要在插入循环之前开始事务,并在循环结束后立即结束.formatStringQueryInsertWithTable真正参数化 - 目前看起来你没有充分利用预备语句,因为尽管使用sqlite3_prepare_v2,你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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16763 次 |
| 最近记录: |