2013-07-22 6 views
0

У меня есть DBManager, который извлекает данные из базы данных (файл sqlite). Все остальные запросы в порядке, но это, кажется, что-то не работаетБаза данных Sqlite не может прочитать столбец

-(NSArray *)readCountries{ 
NSLog(@"[DBManager] readCountries"); 
NSMutableArray *countriesArray = [[NSMutableArray alloc] init]; 
//open db from users filesystem 
if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) { 
    const char* sql = "SELECT DISTINCT country FROM aed ORDER BY rowid"; 
    sqlite3_stmt *statement; 
    if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL) == SQLITE_OK) { 
     //loop through results 
     while (sqlite3_step(statement) == SQLITE_ROW) { 
      //read data from record 
      NSString *_country; 
      char* tmpCountry = (char*)sqlite3_column_text(statement, 1); 
      NSLog(@"tmpCountry = %@", [NSString stringWithUTF8String:tmpCountry]); 
      if (tmpCountry != NULL) { 
       _country = [NSString stringWithUTF8String:tmpCountry]; 
      }else{ 
       _country = @"n/a"; 
      } 
      NSLog(@"country = %@", _country); 
      [countriesArray addObject:_country]; 
     } 
    } 
    //finalize statement 
    sqlite3_finalize(statement); 
} 
//close database 
sqlite3_close(database); 
NSLog(@"[DBManager] countriesArray has %d objects", [countriesArray count]); 
return (NSArray*)countriesArray; 

}

Все, что я получаю от бревен, что мой массив имеет 5 объектов, которые прекрасно - но souldn't быть только «n/a» ... любая идея? Другие запросы хороши, они в основном используют sqlite3_column_text, поэтому я не понимаю, почему он здесь не работает - может быть, свежий глаз поможет.

+0

Что говорит rmaddy о регистрации - как написано, ваш код будет терпеть неудачу, а не сообщать вам, что случилось. (И sqlite3_errmsg часто довольно информативен.) –

ответ

1

Это путаное несогласованность с sqlite C-api. При использовании функций sqlite3_column_xxx индекс столбца основан на 0. Но с функциями sqlite3_bind_xxx индекс столбца основан на 1.

Изменить это:

char* tmpCountry = (char*)sqlite3_column_text(statement, 1); 

к:

char* tmpCountry = (char*)sqlite3_column_text(statement, 0); 

BTW - вы должны добавить else заявления ваших sqlite3_open и sqlite3_prepare вызовов. Если они не работают, вы можете зарегистрировать ошибку, используя функцию sqlite3_errmsg.

+0

Должен также проверять код возврата из sqlite3_step, хотя он требует немного больше работы, поскольку вы должны отфильтровать SQLITE_DONE перед принятием ошибки. –

+0

спасибо, человек, хотя у меня было 0, в какой-то момент он не работал, теперь он выглядит - похоже, что xcode также нужно некоторое время сна;) – raistlin

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