0

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

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

提前致谢。

4

1 回答 1

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;
}

此外,如果输入tofrom来自用户输入的字符串,您可能不想在查询中按字面意思使用它们,因为这很容易受到 SQL 注入攻击。

您还可以考虑使用FMDB,它是 SQLite API 的一个很好的 Objective-C 包装器。

于 2013-09-22T22:13:16.257 回答