2013-06-02 109 views
-1

在下面的代碼中,一切似乎都正確,但註釋行始終返回錯誤代碼null,無論我提供哪些數據。我研究並改變了我能想到的所有參數。第一個sqlite3_bind_text行成功,並且每三次都會失敗。我無法弄清楚。幫幫我?ios sqlite3_bind_text步驟返回null

-(void)fillSqliteDb 
{ 
    sqlite3 *database; 
    if (sqlite3_open([[self sqliteFilePath] UTF8String], &database) != SQLITE_OK) { 
     sqlite3_close(database); 
     NSAssert(0, @"Failed to open database"); 
    } 

    NSString *createSQL = @"CREATE TABLE IF NOT EXISTS FUNCTIONS (nouns TEXT, verbs TEXT, adverbs TEXT, adjectives TEXT);"; 
    char *errorMsg; 
    if (sqlite3_exec (database, [createSQL UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) { 
     sqlite3_close(database); 
     NSAssert(0, @"Error creating table: %s", errorMsg); 
    } 
    sqlite3_stmt *stmt; 

    for (int i=0; i<260; i++) { 
     NSString * pln = self.pluralNouns[i]; // pre-filled array of 260 words 
     NSString * vrb = self.verb[i]; // pre-filled array of 260 words 
     NSString * adv = self.adverb[i]; // pre-filled array of 260 words 
     NSString * adj = self.adjective[i]; // pre-filled array of 260 words 

     char *update = "INSERT INTO FUNCTIONS (nouns, verbs, adverbs, adjectives) VALUES (?, ?, ?, ?);"; 

     if (sqlite3_prepare_v2(database, update, -1, &stmt, nil) == SQLITE_OK) { 
      sqlite3_bind_text(stmt, 1, [pln UTF8String], -1, NULL); 
      if (sqlite3_step(stmt) != SQLITE_DONE) // Works, word ends up in database 
       NSLog(@"Error updating table: %s", errorMsg); 
      sqlite3_bind_text(stmt, 2, [vrb UTF8String], -1, NULL); 
      if (sqlite3_step(stmt) != SQLITE_DONE) // ALWAYS RETURNS Error: NULL 
       NSLog(@"Error updating table: %s", errorMsg); 
      sqlite3_bind_text(stmt, 3, [adv UTF8String], -1, NULL); 
      if (sqlite3_step(stmt) != SQLITE_DONE) // ALWAYS RETURNS Error: NULL 
       NSLog(@"Error updating table: %s", errorMsg); 
      sqlite3_bind_text(stmt, 4,[adj UTF8String], -1, NULL); 
      if (sqlite3_step(stmt) != SQLITE_DONE) // ALWAYS RETURNS Error: NULL 
       NSLog(@"Error updating table: %s", errorMsg); 
     } 

    } 

} 

回答

7

這段代碼有幾個錯誤。

  1. 只呼叫sqlite3_prepare_v2一次。在for循環之前執行此操作。
  2. 您需要爲每個變量調用sqlite3_bind_xxx一次,全部在致電sqlite3_step之前。
  3. 每回路只呼叫sqlite2_step一次。在循環結束時執行此操作。
  4. 在循環結束後調用sqlite3_step之後,您需要致電sqlite3_reset
  5. 循環後,您需要在準備的語句上調用sqlite3_finalize
  6. 由於您在方法開始時打開了數據庫連接,因此您需要在方法結束時關閉它。
  7. 您使用errorMsg所有日誌後檢查每個sqlite3_step的調用結果是錯誤的。 errorMsg僅在撥打電話sqlite3_exec時設置。要獲得其他呼叫的錯誤消息,您需要使用sqlite3_errmsg

更新代碼:

- (void)fillSqliteDb { 
    sqlite3 *database; 
    if (sqlite3_open([[self sqliteFilePath] UTF8String], &database) != SQLITE_OK) { 
     sqlite3_close(database); 
     NSAssert(0, @"Failed to open database"); 
    } 

    NSString *createSQL = @"CREATE TABLE IF NOT EXISTS FUNCTIONS (nouns TEXT, verbs TEXT, adverbs TEXT, adjectives TEXT);"; 
    char *errorMsg; 
    if (sqlite3_exec (database, [createSQL UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) { 
     sqlite3_close(database); 
     NSAssert(0, @"Error creating table: %s", errorMsg); 
    } 

    sqlite3_stmt *stmt; 
    char *update = "INSERT INTO FUNCTIONS (nouns, verbs, adverbs, adjectives) VALUES (?, ?, ?, ?);"; 

    if (sqlite3_prepare_v2(database, update, -1, &stmt, nil) == SQLITE_OK) { 
     for (int i=0; i<260; i++) { 
      NSString * pln = self.pluralNouns[i]; // pre-filled array of 260 words 
      NSString * vrb = self.verb[i]; // pre-filled array of 260 words 
      NSString * adv = self.adverb[i]; // pre-filled array of 260 words 
      NSString * adj = self.adjective[i]; // pre-filled array of 260 words 

      sqlite3_bind_text(stmt, 1, [pln UTF8String], -1, NULL); 
      sqlite3_bind_text(stmt, 2, [vrb UTF8String], -1, NULL); 
      sqlite3_bind_text(stmt, 3, [adv UTF8String], -1, NULL); 
      sqlite3_bind_text(stmt, 4, [adj UTF8String], -1, NULL); 

      if (sqlite3_step(stmt) != SQLITE_DONE) // ALWAYS RETURNS Error: NULL 
       NSLog(@"Error updating table: %s", sqlite3_errmsg(database)); 
      sqlite3_reset(stmt); 
     } 

     sqlite3_finalize(stmt); 
    } 

    sqlite3_close(database); 
} 
+0

OK,我已經採取了你的建議,並得到它現在的工作。我也使用代碼中顯示的sqlite3_exec來獲得它的工作。非常感謝您的幫助。很明顯,我真的需要它。 – user2445745