2012-11-25 84 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