Беда с sqlite - PullRequest
       24

Беда с sqlite

0 голосов
/ 29 ноября 2011

Я разрабатываю приложение с использованием базы данных 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.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2013

Почему вы пытаетесь получить динамический доступ к имени таблицы? Я рекомендую использовать более безопасный подход и использовать подготовленный оператор с параметрами и преобразовывать ваш ответ в объекты модели следующим образом:

- (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;
    }
}
0 голосов
/ 29 ноября 2011

Я недавно работал с SQLite, так что это всего лишь предположение из моего опыта ... В запросе SELECT удалите точку с запятой.

"SELECT %@ FROM '%@'"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...