2011-11-29 152 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; 
    } 
}