2009-12-03 97 views
2

好,我有我的查询问题,我不知道为什么!请帮助查询选择sqlite的目标C iPhone

我尝试从表中选择一个名为莫内达一个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'' 

我认为这个问题是在这条线,但我不硝酸钾如何解决建议pleasee!

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

回答

6

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

例如:

SELECT idMoneda 
FROM moneda 
WHERE nombre = '%@' 

否则,当SQL编译,你传递值本身视为列名(欧元),而不是​​列的候选值。

建议你考虑使用准备语句而非组装字符串“手动”。 见this related SO question

+1

+1暗示准备语句。 OP应该查看'sqlite3_bind_ *'函数。 – jensgram 2009-12-03 09:27:50

+0

谢谢:)工作!这是我做过什么: \t \t为const char *的SQLStatement = [[的NSString stringWithFormat:@ “从莫内达选择idMoneda其中农布雷= '%@'”,nombreMonedaParametro] cStringUsingEncoding:NSUTF8StringEncoding]。 – babyDeveloper 2009-12-05 20:04:24

0

如果您在选择查询的特殊字符,请使用NSUTF8StringEncoding而不是NSASCIIStringEncoding

NSString *s = @"select * from AddressGeocode where address like 'São Paulo, Brazil'"; 

const char *sqlStatement = [s cStringUsingEncoding:NSUTF8StringEncoding];