当前位置:  开发笔记 > 数据库 > 正文

查询选择Sqlite Objective C iphone

如何解决《查询选择SqliteObjectiveCiphone》经验,为你挑选了1个好方法。

好吧,我的查询有问题,我不知道为什么!请帮忙

我尝试从名为moneda的表中选择一个id,并给出像参数这样的名称,

这是我的查询方法:

-(int)ConsultaIdMoneda:(NSString*) nombreMonedaParametro
{
    int idMonedaObtenido;
    NSLog(@" entre a consultar id de la moneda desde el app delegate");
    sqlite3 *database;

    const char *path = [[[NSBundle mainBundle] pathForResource:@"database2" ofType:@"sqlite"] UTF8String];
    if(sqlite3_open(path, &database) == SQLITE_OK)      
    {
        const char *sqlStatement =[[NSString stringWithFormat:@"Select idMoneda from moneda Where nombre = %@",nombreMonedaParametro] cStringUsingEncoding:NSUTF8StringEncoding];

        NSLog(@"%s",sqlStatement);
        sqlite3_stmt *compiledStatement;
        NSInteger result = sqlite3_prepare_v2(database,sqlStatement, -1, &compiledStatement, NULL);
        NSLog(@"%s",sqlStatement);
        if(result == SQLITE_OK) 
        {
            idMonedaObtenido = [[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)] intValue];
        }
        else
        {
            NSAssert1(0, @"Error . '%s'", sqlite3_errmsg(database));            
        }
        sqlite3_reset(compiledStatement);
        sqlite3_finalize(compiledStatement);
    }

    sqlite3_close(database);
    return idMonedaObtenido;        
}

这是错误:

2009-12-03 00:28:45.715 BCDTravel[1220:20b] *** Assertion failure in -[BCDTravelAppDelegate ConsultaIdMoneda:], /Users/Mely/Desktop/BCDTravel version 45/Bcd/Classes/BCDTravelAppDelegate.m:101
2009-12-03 00:28:45.717 BCDTravel[1220:20b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Error haciendo el select. 'no such column: euros''

我认为问题出在这一行,但我不知道如何解决建议请!

const char *sqlStatement =[[NSString stringWithFormat:@"Select idMoneda from moneda Where nombre = %@",nombreMonedaParametro] cStringUsingEncoding:NSUTF8StringEncoding];

martin clayt.. 6

因为您传递的是字符值,所以需要在SQL中的参数周围加上引号.

例如:

SELECT idMoneda
FROM   moneda
WHERE  nombre = '%@'

否则,在编译SQL时,传入的值本身将被视为列名(欧元),而不是列的候选值nombre.

建议你研究使用预准备语句而不是组装字符串'手动'.看到这个相关的SO问题.



1> martin clayt..:

因为您传递的是字符值,所以需要在SQL中的参数周围加上引号.

例如:

SELECT idMoneda
FROM   moneda
WHERE  nombre = '%@'

否则,在编译SQL时,传入的值本身将被视为列名(欧元),而不是列的候选值nombre.

建议你研究使用预准备语句而不是组装字符串'手动'.看到这个相关的SO问题.

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有