2013-09-22 155 views
0

我想在不同的度量单位之间构建一个类似转换器的应用程序。目前,我正在使用SQLite,并且我有一张表格,其中包含不同的单位以及相应的费率。从SQLite表中检索REAL值

里面我的应用我有以下功能检索速度值取决于所选择单位:

+(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

我试图构建查询直接在我的终端窗口,并返回正确的值

我试过NSNumberinitWithFloat:也没有成功。

任何人都可以解释我在这里做错了什么?

在此先感谢。

+0

请务必理解[SQLite数据类型](http://www.sqlite.org/datatype3.html)和“类型亲和性”。 –

回答

0

你永远不会真正执行查询。 sqlite3_prepare_v2“编译”查询,但实际上并没有运行它。您可能打算致电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; 
} 

此外,虽然是在它,如果tofrom琴弦来自用户的输入,你可能不希望在查询字面上使用它们,因为这是容易受到SQL注入攻击。

你也可以考虑使用FMDB这是一个很好的SQLite API的Objective-C包装器。

+0

谢谢!函数现在返回正确的结果。感谢您的快速回复。因此,除了finalize(不知道我是第一次使用SQLite),我的错误是没有使用sqlite3_step()? 也感谢您提供的链接。 – OutOfBoundsException

+0

如果每次打开数据库,还需要关闭数据库。当前的代码当前(并且不必要地)只有在数据库无法打开时才关闭数据库。 – rmaddy

+0

是的,主要问题阻止您获得您期望的值,因为没有'sqlite3_step'。而rmaddy也是对的。 – ipmcc