This is the routine I generally use to insert data in bulk..
static sqlite3 *masterDB;
static sqlite3_stmt *init_statement = nil;
{
NSString* statement;
statement = @"BEGIN EXCLUSIVE TRANSACTION";
if (sqlite3_prepare_v2(masterDB, [statement UTF8String], -1, &init_statement, NULL) != SQLITE_OK) {
printf("db error: %s
", sqlite3_errmsg(masterDB));
return NO;
}
if (sqlite3_step(init_statement) != SQLITE_DONE) {
sqlite3_finalize(init_statement);
printf("db error: %s
", sqlite3_errmsg(masterDB));
return NO;
}
NSTimeInterval timestampB = [[NSDate date] timeIntervalSince1970];
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"MMM dd, yyyy"];
NSDate *now = [NSDate date];
NSString *dateTime = [dateFormat stringFromDate:now];
[dateFormat release];
statement = @"insert into table(id, name) values(?,?)";
sqlite3_stmt *compiledStatement;
if(sqlite3_prepare_v2(masterDB, [statement UTF8String], -1, &compiledStatement, NULL) == SQLITE_OK)
{
for(int i = 0; i < [aryList count]; i++){
NSString *objName = [aryList objectAtIndex:i];
sqlite3_bind_int(compiledStatement, 1, i );
sqlite3_bind_text(compiledStatement, 2, [objName UTF8String], -1, SQLITE_TRANSIENT);
while(YES){
NSInteger result = sqlite3_step(compiledStatement);
if(result == SQLITE_DONE){
break;
}
else if(result != SQLITE_BUSY){
printf("db error: %s
", sqlite3_errmsg(masterDB));
break;
}
}
sqlite3_reset(compiledStatement);
}
timestampB = [[NSDate date] timeIntervalSince1970] - timestampB;
NSLog(@"Insert Time Taken: %f",timestampB);
// COMMIT
statement = @"COMMIT TRANSACTION";
sqlite3_stmt *commitStatement;
if (sqlite3_prepare_v2(masterDB, [statement UTF8String], -1, &commitStatement, NULL) != SQLITE_OK) {
printf("db error: %s
", sqlite3_errmsg(masterDB));
return NO;
}
if (sqlite3_step(commitStatement) != SQLITE_DONE) {
printf("db error: %s
", sqlite3_errmsg(masterDB));
return NO;
}
sqlite3_finalize(compiledStatement);
sqlite3_finalize(commitStatement);
return YES;
}
return YES;
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…