2013-09-22 2 views
0

Я пытаюсь создать приложение, подобное конвертеру, между различными единицами измерения. На данный момент я использую SQLite, и у меня есть таблица, которая включает в себя разные единицы наряду с соответствующими ставками.Получение значения REAL из таблицы SQLite

Внутри моего приложения У меня есть следующие функции для получения значений скорости в зависимости от выбранных единиц:

+(float)rateFrom:(NSString *)from to:(NSString *)to{ 
    if (sqlite3_open([sqlPath UTF8String], &database) == SQLITE_OK) { 

     const char *sql = [[NSString stringWithFormat:@"SELECT %@ FROM Units WHERE code = '%@'", to, from] UTF8String]; 
     sqlite3_stmt *selectstmt; 

     if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) { 
      return (float)sqlite3_column_double(selectstmt, 0); 
     } 
    } 
    else{ 
     sqlite3_close(database); 
    } 
    return -1; 
} 

Проблема заключается в том, что скорость возврата составляет 0,00

Я попытался сконструированный запрос непосредственно на моем окне терминала и возвращает правильные значения

Я пробовал NSNumber и initWithFloat: без успеха.

Может ли кто-нибудь объяснить мне, что я делаю неправильно здесь?

Заранее спасибо.

+0

Убедитесь, что вы понимаете [типы данных SQLite] (http://www.sqlite.org/datatype3.html) и «тип сродства». –

ответ

0

Вы никогда не выполняете запрос. sqlite3_prepare_v2 «компилирует» запрос, но фактически не выполняет run it. Вероятно, вам захочется позвонить sqlite3_step, чтобы выполнить запрос. Вы также не вызываете sqlite3_finalize в свой скомпилированный оператор, поэтому вы также пропускаете память с помощью этого кода. Это может помочь:

+ (float)rateFrom:(NSString *)from to:(NSString *)to 
{ 
    float retVal = -1; 
    if (sqlite3_open([sqlPath UTF8String], &database) == SQLITE_OK) { 

     const char *sql = [[NSString stringWithFormat:@"SELECT %@ FROM Units WHERE code = '%@'", to, from] UTF8String]; 
     sqlite3_stmt *selectstmt; 

     if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK && 
      sqlite3_step(selectstmt) == SQLITE_ROW) { 
      retVal = (float)sqlite3_column_double(selectstmt, 0); 
     } 
     if (selectstmt) { 
      sqlite3_finalize(selectstmt); 
     } 
     sqlite3_close(database); 
     database = NULL; 
    } 

    return retVal; 
} 

Кроме того, в то время как были у него, если строки в to и from приходят из пользовательского ввода, вы, вероятно, не хотите использовать их буквально в запросах, так как это уязвимо для SQL инъекций атаки.

Вы также можете рассмотреть возможность использования FMDB, который является хорошей оболочкой Objective-C для SQLite API.

+0

Спасибо! Функция возвращает правильные результаты. Спасибо за быстрый ответ. Итак, помимо финализации (не знал, что, как и в первый раз, когда я работаю с SQLite), моя ошибка заключалась в не использовании sqlite3_step()? Спасибо за предоставленную ссылку. – OutOfBoundsException

+0

Вам также необходимо закрыть базу данных после ее использования, если вы откроете ее каждый раз. Текущий код в настоящее время (и без необходимости) закрывает базу данных только в том случае, если она не может быть открыта. – rmaddy

+0

Да, основной проблемой, которая мешала вам получить ожидаемое значение, было отсутствие «sqlite3_step». И Рмадди тоже прав. – ipmcc

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