2011-11-29 156 views
0

我开发一个应用程序使用sqlite数据库,我需要从表中取单行。我试过这个:麻烦与sqlite

-(void)getRowFromTableNamed:(NSString *)tableName 
        whichRow:(NSString *)row 
{ 
    NSString *qsql = [NSString stringWithFormat: 
         @"SELECT %@ FROM %@", 
         row, tableName]; 

    sqlite3_stmt *statement; 
    if (sqlite3_prepare_v2(db, [qsql UTF8String], -1, &statement, nil) == SQLITE_OK) { 
     if (sqlite3_step(statement) == SQLITE_OK) { 
      char *field = (char *) sqlite3_column_text(statement, 0); 
      NSString *fieldStr = [[NSString alloc] initWithUTF8String:field]; 
      self.dataString = fieldStr; 
      [fieldStr release]; 
     } 
     sqlite3_finalize(statement); 
    } 
} 

但它不起作用。所有其他方法完美地工作。谁能帮忙?

是的,事实是我删除了分号和单引号并没有解决任何问题。是的,它在sqlite3_prepare_v2上失败。

+0

你说的“它不工作”的意思。哪里(以及如何)失败? –

+0

它只是不返回任何东西。它不执行请求。 – Noobass

回答

0

我最近与SQLite合作,所以这只是我的经验猜测... 在您的SELECT查询中,删除分号。

"SELECT %@ FROM '%@'" 
0

你为什么试图首先动态地访问表名?我建议使用一个更安全的方法,并使用带有参数的一份声明中,并转换你的回应的对象,像这样的模型:

- (NSMutableArray *) getWidgets 
{ 
    NSMutableArray *widgets = [[NSMutableArray alloc] init]; 

    sqlite3 *db; 

    @try 
    { 
     NSFileManager *fileMgr = [NSFileManager defaultManager]; 
     NSString *dbPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"widgetDb.sqlite"]; 
     BOOL success = [fileMgr fileExistsAtPath:dbPath]; 

     if(!success) 
      NSLog(@"Cannot locate database file '%@'.", dbPath); 

     if(sqlite3_open([dbPath UTF8String], &db) != SQLITE_OK) 
      NSLog(@"An error has occured."); 

     const char *sql = "SELECT id, name, description FROM widgets"; 
     sqlite3_stmt *sqlStatement; 

     if(sqlite3_prepare_v2(db, sql, -1, &sqlStatement, NULL) != SQLITE_OK) 
      NSLog(@"Problem with prepare statement"); 

     Widget *widget; 

     while (sqlite3_step(sqlStatement)==SQLITE_ROW) 
     { 
      widget = [[Widget alloc]init]; 

      widget.id = [NSNumber numberWithInt: (int)sqlite3_column_int(sqlStatement, 0)]; 
      widget.name = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 1)]; 
      widget.description = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 2)]; 

      [widgets addObject:widget]; 
     } 
    } 
    @catch (NSException *exception) 
    { 
     NSLog(@"An exception occured: %@", [exception reason]); 
    } 
    @finally 
    { 
     return widgets; 
    } 
}