2012-11-25 62 views
1

我需要插入大量的记录到我的数据库,但我得到一个错误:iOS版 - SQLite的BULK INSERT错误

Prepare-error library routine called out of sequence 

这里是我的代码:

NSString *databaseName = @"DB.sqlite"; 
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
    NSString *documentsDir = [documentPaths objectAtIndex:0]; 
    NSString *databasePath = [documentsDir stringByAppendingPathComponent:databaseName]; 

    sqlite3 *concertsDB; 
    const char *dbpath = [databasePath UTF8String]; 

    if (sqlite3_open(dbpath, &concertsDB) == SQLITE_OK) 
    { 
     sqlite3_exec(concertsDB, "BEGIN TRANSACTION", 0, 0, 0); 
     const char *sqlStatement = "INSERT INTO concertsData VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; 
     sqlite3_stmt *compiledStatement; 

     if (sqlite3_prepare_v2(concertsDB, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) { 
      int hasError; 

      for (int i=0; i<[events count]; i++) { 

       sqlite3_bind_text(compiledStatement, 1, [[[events objectAtIndex:i] title] UTF8String], -1, SQLITE_TRANSIENT); 
       sqlite3_bind_int(compiledStatement, 2, [[[events objectAtIndex:i] date] timeIntervalSince1970]); 

       sqlite3_bind_text(compiledStatement, 3, [[[events objectAtIndex:i] time] UTF8String], -1, SQLITE_TRANSIENT); 

       sqlite3_bind_text(compiledStatement, 4, [[[events objectAtIndex:i] shortDesription] UTF8String], -1, SQLITE_TRANSIENT); 

       sqlite3_bind_text(compiledStatement, 5, [[[events objectAtIndex:i] conductor] UTF8String], -1, SQLITE_TRANSIENT); 

       sqlite3_bind_text(compiledStatement, 6, [[[events objectAtIndex:i] location] UTF8String], -1, SQLITE_TRANSIENT); 

       sqlite3_bind_text(compiledStatement, 7, [[[events objectAtIndex:i] durations] UTF8String], -1, SQLITE_TRANSIENT); 

       sqlite3_bind_text(compiledStatement, 8, [[[events objectAtIndex:i] works] UTF8String], -1, SQLITE_TRANSIENT); 

       sqlite3_bind_text(compiledStatement, 9, [[[events objectAtIndex:i] solists] UTF8String], -1, SQLITE_TRANSIENT); 

       sqlite3_bind_text(compiledStatement, 10, [[[events objectAtIndex:i] fulltext] UTF8String], -1, SQLITE_TRANSIENT);      

       sqlite3_bind_text(compiledStatement, 11, [[[[events objectAtIndex:i] concertUrl] absoluteString] UTF8String], -1, SQLITE_TRANSIENT); 

       sqlite3_bind_text(compiledStatement, 12, [[[[events objectAtIndex:i] buyUrl] absoluteString] UTF8String], -1, SQLITE_TRANSIENT); 

       sqlite3_bind_text(compiledStatement, 13, [[[events objectAtIndex:i] imageName] UTF8String], -1, SQLITE_TRANSIENT); 

       if (sqlite3_step(compiledStatement) != SQLITE_DONE) { 
        hasError=1; 
        NSLog(@"Prepare-error %s", sqlite3_errmsg(concertsDB)); 
       } 

       sqlite3_clear_bindings(compiledStatement); 
      } 
      sqlite3_reset(compiledStatement); 
      if(hasError == 0) { 
       sqlite3_exec(concertsDB, "COMMIT", 0, 0, 0); 
      } 
      else { 
       sqlite3_exec(concertsDB, "ROLLBACK", 0, 0, 0); 
      } 

     } 

     sqlite3_close(concertsDB); 
    } 

谁能告诉我什么可能是错误的?

回答

2

拨打sqlite3_reset替换电话sqlite3_clear_bindings。然后用sqlite3_finalize的电话将当前呼叫替换为sqlite3_reset

sqlite3_reset必须在呼叫sqlite3_step后调用,如果您需要再次重复使用该语句。

sqlite3_finalize必须在完全使用它时在语句上调用。

您不需要拨打sqlite3_clear_bindings,因为您在每个循环迭代中都设置了每个绑定变量。

+0

谢谢!一切都像你解释过的一样工作! :-) – Oleg