从SQLite表中检索REAL值

时间:2013-09-22 21:33:33

标签: ios objective-c sqlite

我正在尝试在不同的测量单位之间构建类似转换器的应用程序。目前,我正在使用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

我已在终端窗口上直接尝试构造的查询并返回正确的值

我已尝试NSNumberinitWithFloat:但也没有成功。

有谁能解释一下我在这里做错了什么?

提前致谢。

1 个答案:

答案 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} tofrom中的字符串来自用户输入,但您可能不希望在查询中使用它们,因为这很容易受到SQL注入攻击攻击。

你也可以考虑使用FMDB,它是SQLite API的一个不错的Objective-C包装器。