我想在我的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 TRANSACTION和COMMIT 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,&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,4,getDouble()); sqlite3_bind_int(stmt,5,getInt()); sqlite3_bind_int(stmt,6,7,getInt()); if (sqlite3_step(stmt) != SQLITE_DONE) { printf("Commit Failed!\n"); } sqlite3_reset(stmt); } sqlite3_exec(mDb,"COMMIT TRANSACTION",&errorMessage); sqlite3_finalize(stmt);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。