我正在尝试在不同的测量单位之间构建类似转换器的应用程序。目前,我正在使用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 :(得分:1)
你永远不会真正执行查询。 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;
}
此外,虽然在{I} to
和from
中的字符串来自用户输入,但您可能不希望在查询中使用它们,因为这很容易受到SQL注入攻击攻击。
你也可以考虑使用FMDB,它是SQLite API的一个不错的Objective-C包装器。