2013-06-02 3 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

ОК, я принял ваш совет и получил его в настоящее время работает. Я также работал с sqlite3_exec, как показано в коде. Большое спасибо за Вашу помощь. Мне это действительно нужно, как видно. – user2445745

Смежные вопросы